使用 async/await 动态生成承诺链
Dynamically generate a chain of promises with async/await
说,我需要按顺序重复一个 AJAX 请求 N 次。
通常(即没有 async/await),我会使用 reduce
来链接承诺:
function timeout (ms = 1000) {
return new Promise(resolve => setTimeout(resolve, ms))
}
function request (message, ms = 1000) {
return timeout(ms).then(() => console.log(message))
}
function makeArray (i) {
return new Array(i).fill(null);
}
makeArray(5).reduce(
(promise, _, i) => promise.then(() => request(i)),
Promise.resolve()
)
如何用 async/await 重写此代码?
我想await request(i)
而不是promise.then(() => request(i))
。
我所有的尝试都以 运行 并行结束。我要顺序。
记住 await
只能从 async
函数调用。
这里我只是封装了一个函数 run
,它甚至可以是一个 IIFE..
在大多数情况下,当您开始使用 async / await
时,您会从另一个 async
函数调用,因此不需要这个 run
存根。
function timeout (ms = 1000) {
return new Promise(resolve => setTimeout(resolve, ms))
}
function request (message, ms = 1000) {
return timeout(ms).then(() => console.log(message))
}
async function run() {
for (let trys = 0; trys < 5; trys ++) {
await request(trys);
}
}
run();
说,我需要按顺序重复一个 AJAX 请求 N 次。
通常(即没有 async/await),我会使用 reduce
来链接承诺:
function timeout (ms = 1000) {
return new Promise(resolve => setTimeout(resolve, ms))
}
function request (message, ms = 1000) {
return timeout(ms).then(() => console.log(message))
}
function makeArray (i) {
return new Array(i).fill(null);
}
makeArray(5).reduce(
(promise, _, i) => promise.then(() => request(i)),
Promise.resolve()
)
如何用 async/await 重写此代码?
我想await request(i)
而不是promise.then(() => request(i))
。
我所有的尝试都以 运行 并行结束。我要顺序。
记住 await
只能从 async
函数调用。
这里我只是封装了一个函数 run
,它甚至可以是一个 IIFE..
在大多数情况下,当您开始使用 async / await
时,您会从另一个 async
函数调用,因此不需要这个 run
存根。
function timeout (ms = 1000) {
return new Promise(resolve => setTimeout(resolve, ms))
}
function request (message, ms = 1000) {
return timeout(ms).then(() => console.log(message))
}
async function run() {
for (let trys = 0; trys < 5; trys ++) {
await request(trys);
}
}
run();