为什么在for循环里的promise,无法读取到index

发布于 2022-09-04 21:32:02 字数 483 浏览 9 评论 0

for (var key in arr) {
  if (arr.hasOwnProperty(key)) {
    console.log('这一次可以输出key'+key)
    this.$http.post('/getPaperListByCIdAndTId', {
      teacherId: window._const.teacherId,
    }).then((res_in) => {
      console.log('这一次不能输出key'+key)
    })
  }
} 

第二次输出的是$remove

clipboard.png

或者告诉我怎样在.then里获取到key

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

戈亓 2022-09-11 21:32:02

这个问题是比较典型的循环变量作用域的问题。then() 中的回调被调用的时候 key 可能已经循环到最后一个了(也可能是间的某个值),所以里面使用的 key 值是当时的 key 值。这在 ES6 中要可以用 let 代替 var 来解决(因为我看你已经用了 ES6 的箭头函数,所以先用 ES6)

for (let key in arr) {
    if (arr.hasOwnProperty(key)) {
        console.log("这一次可以输出key" + key);
        this.$http.post("/getPaperListByCIdAndTId", {
            teacherId: window._const.teacherId
        }).then((res_in) => {
            console.log("这一次不能输出key" + key);
        });
    }
}

如果要写 ES5,可以用个 IIFE 来封局部化 key 值(通过参数传入,所以不会变了)

for (var key in arr) {
    if (arr.hasOwnProperty(key)) {
        (function() {
            console.log("这一次可以输出key" + key);
            this.$http.post("/getPaperListByCIdAndTId", {
                teacherId: window._const.teacherId
            }).then(function(res_in) {
                console.log("这一次不能输出key" + key);
            });
        })(key);
    }
}

推荐函数式写法,看起来比较简洁,ES6 可以这样干

Object.keys(arr)
    .filter(key => arr.hasOwnProperty(key))
    .forEach(key => {
        console.log(`这一次可以输出 key:${key}`);
        this.$http.post("/getPaperListByCIdAndTId", {
            teacherId: window._const.teacherId
        }).then(res_in => {
            console.log(`这一次不能输出 key 才怪:${key}`);
        });
    });

ES2017 还可以用 async,语法更简洁

Object.keys(arr)
    .filter(key => arr.hasOwnProperty(key))
    .forEach(async key => {
        console.log(`这一次可以输出 key:${key}`);
        const res_in = await this.$http.post("/getPaperListByCIdAndTId", {
            teacherId: window._const.teacherId
        });
        console.log(`这一次不能输出 key 才怪:${key}`);
    });
夜司空 2022-09-11 21:32:02

刚测试了下,是可以的,而且一定要用let而不是var,否则输出的都是最后一个key

clipboard.png

-柠檬树下少年和吉他 2022-09-11 21:32:02

关键字:闭包

难忘№最初的完美 2022-09-11 21:32:02

用array.map解决会更优雅

樱花落人离去 2022-09-11 21:32:02

闭包了 es6中将var换成let即可

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文