3 回答

TA贡献1797条经验 获得超6个赞
new Promise
resolve
reject
then
then
await
带着 for
循环,以立即解决承诺开始。 带着 Array#reduce
首先是一个立竿见影的承诺 具有将自身传递为分辨率回调的函数。 与ECMAScript2017 async
/await
句法 与提议的ECMAScript 2020 for await...of
句法
1.与 for
for
new Promise
for (let i = 0, p = Promise.resolve(); i < 10; i++) { p = p.then(_ => new Promise(resolve => setTimeout(function () { console.log(i); resolve(); }, Math.random() * 1000) ));}
2.与 reduce
[...Array(10)].reduce( (p, _, i) => p.then(_ => new Promise(resolve => setTimeout(function () { console.log(i); resolve(); }, Math.random() * 1000) )), Promise.resolve() );
3.函数本身作为分辨率回调。
(function loop(i) { if (i < 10) new Promise((resolve, reject) => { setTimeout( () => { console.log(i); resolve(); }, Math.random() * 1000); }).then(loop.bind(null, i+1));})(0);
loop
resolve()
then
loop.bind(null, i+1)
_ => loop(i+1)
.
4.与 async
/await
(async function loop() { for (let i = 0; i < 10; i++) { await new Promise(resolve => setTimeout(resolve, Math.random() * 1000)); console.log(i); }})();
new Promise()
async
await
await
setTimeout
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));(async function loop() { for (let i = 0; i < 10; i++) { await delay(Math.random() * 1000); console.log(i); }})();
5.与 for await...of
for await...of
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));async function * randomDelays(count ,max) { for (let i = 0; i < count; i++) yield delay(Math.random() * max).then(() => i);}(async function loop() { for await (let i of randomDelays(10, 1000)) console.log(i);})();
添加回答
举报