3 回答
TA贡献1794条经验 获得超8个赞
new Promiseresolverejectthenthenawait
带着 for循环,以立即解决承诺开始。 带着 Array#reduce首先是一个立竿见影的承诺 具有将自身传递为分辨率回调的函数。 与ECMAScript2017 async/await句法 与提议的ECMAScript 2020 for await...of句法
1.与 for
fornew 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()thenloop.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()asyncawaitawait
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);})();添加回答
举报
