我有一個函式,它采用一組異步/同步函式,并以與傳遞輸入相同的順序依次(而不是并行)呼叫它們中的每一個。
例如:
const sleep = (delay) => new Promise((r) => setTimeout(r, delay))
const fn1 = async () => {
await sleep(2000)
console.log('fn1')
return 'fn1'
}
const fn2 = async () => {
await sleep(3000)
console.log('fn2')
return 'fn2'
}
const fn3 = async () => {
await sleep(1000)
console.log('fn3')
return 'fn3'
}
const fn4 = () => {
console.log('fn4')
return 'fn4'
}
function serializeAsyncFns(fns) {
return fns.reduce(
(promise, fn) => promise.then(() => fn()),
Promise.resolve()
)
}
serializeAsyncFns([fn1, fn2, fn3, fn4])
// fn1 -> fn2 -> f3 -> f4
但是現在的回傳值serializeAsyncFns是一個promise,它決議為輸入串列中最后一個函式的回傳值,即f4. 有沒有辦法調整這個函式,以便回傳的承諾決議為所有函式的值陣列,按照它們如何傳遞的順序。
在這種情況下,它將是['fn1', 'fn2', 'fn3', 'fn4']
Promise.all在這里不起作用,因為它會并行觸發所有承諾。
uj5u.com熱心網友回復:
最簡單的方法是使用 for 回圈和 async/await
async function serializeAsyncFns(fns) {
const result = [];
for (const fn of fns) {
result.push(await fn());
}
return result;
}
如果由于某種原因您不能對該功能使用 async/await,這就是我在 async/await 出現之前所做的事情
const serializeAsyncFns = fns =>
fns.reduce((promise, fn) =>
promise.then(results => Promise.resolve(fn()).then(result => [...results, result])),
Promise.resolve([])
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513480.html
