我的理解是async/await是promise的语法糖。我想也许这可能意味着我们可以使用Promise.then.
重写async/await风格的代码。使用async/await可以在for循环中等待Promise
。那么,我们可以用promise来做这样的事情吗?我们如何用Promise.then
而不是await
来重写这个?
let zeros = new Array(10000).fill(0);
(async () => {
for (let zero of zeros) {
await new Promise((r)=>setTimeout(r, 1000)); //1
console.log(zero);
}
})();
没有await
,仍然有几种方法可以完成它。我认为最接近原始的是链式承诺:
let zeros = new Array(10000).fill(0);
let p = Promise.resolve(); // the promise that will be chained
for (let zero of zeros) {
p = p.then(() => new Promise((r)=>setTimeout(r, 1000)))
.then(() => console.log(zero));
}
你可以把它想象成:
let p = Promise.resolve()
.then(() => new Promise((r)=>setTimeout(r, 1000)))
.then(() => console.log(0))
.then(() => new Promise((r)=>setTimeout(r, 1000)))
.then(() => console.log(0))
.then(() => new Promise((r)=>setTimeout(r, 1000)))
.then(() => console.log(0))
.then(() => new Promise((r)=>setTimeout(r, 1000)))
.then(() => console.log(0))
// ... etc ...
.then(() => new Promise((r)=>setTimeout(r, 1000)))
.then(() => console.log(0));
循环后
在原始代码中之后的代码for
循环只会在所有计时器过期时执行,即当最后一个承诺已经解决时。
所以代码的其余部分也异步执行。如果没有await
,您需要再次使用then
回调引入这种异步行为:
p.then(() => {
/* remaining code */
});