如何使用Promise重写代码.然后不使用await?



我的理解是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 */
});

最新更新