3 回答

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超7個(gè)贊
new Promise
resolve
reject
then
then
await
帶著 for
循環(huán),以立即解決承諾開始。 帶著 Array#reduce
首先是一個(gè)立竿見影的承諾 具有將自身傳遞為分辨率回調(diào)的函數(shù)。 與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.函數(shù)本身作為分辨率回調(diào)。
(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);})();
添加回答
舉報(bào)