为什么这个promise最后一个打印结果是5?
打印出0~4我能想明白,为什么会最后一行打印的是5呢?5是什么时候传入的
const tasks = []; // 这里存放异步操作的 Promise
const output = (i) => new Promise((resolve) => {
setTimeout(() => {
console.log(new Date, i);
resolve();
}, 1000 * i);
});
// 生成全部的异步操作
for (var i = 0; i < 5; i++) {
tasks.push(output(i));
}
// 异步操作完成之后,输出最后的 i
Promise.all(tasks).then(() => {
setTimeout(() => {
console.log(new Date, i);
}, 1000);
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你打印的是全局变量i 而这个变量在for循环执行完后就是5了
i是全局变量,for循环最后一次,i++,尽管跳出了循环,但i变成了5,promise.all().then()里面那个setTimeout里打印了i,所以最后就变成了5
for循环和Promise.all作用域在同一级 所以i是5
使用var声明的变量是没有局部作用域的概念,只有函数作用域。
这种写法和下面的写法是一样的效果:
因为i是在最外层作用域的,而then中的回调是在所有promise都resolve之后才执行的,这是 i 已经被赋值为5,所以输出5.
如果使用let声明i,你就会看到报错的情况