Ben*_*nji 4 javascript node.js promise async-await async.js
我有一个 Promise.allSettled 用于解析数据库中的数据。我有一个 Promises 数组,我通过 Promise.allSettled 运行它们,然后我只使用已解决的那些。是否可以在 Promise.allSettled 中设置超时,以便如果承诺在 5 秒后仍未解析数据,它应该返回为被拒绝?
我的代码如下所示:
await Promise.allSettled(promises)
.then(result => result.forEach(d => {
if (d.status === 'fulfilled') {
data.push(d.value)
}
}));
Run Code Online (Sandbox Code Playgroud)
您可以使用Promise.race原始承诺和拒绝的超时承诺,例如:
await Promise.allSettled(
promises.map(promise => Promise.race([promise, rejectAfterDelay(5000)])) // **
)
.then(result => result.forEach(d => {
if (d.status === 'fulfilled') {
data.push(d.value)
}
}));
Run Code Online (Sandbox Code Playgroud)
...哪里rejectAfterDelay是这样的:
const rejectAfterDelay = ms => new Promise((_, reject) => {
setTimeout(reject, ms, new Error("timeout"));
};
Run Code Online (Sandbox Code Playgroud)
旁注:您可以使用filter过滤掉被拒绝的承诺:
data.push(...
await Promise.allSettled(
promises.map(promise => Promise.race([promise, rejectAfterDelay(5000)]))
).then(result => result.filter(({status}) => status === "fulfilled"))
);
Run Code Online (Sandbox Code Playgroud)
...虽然我认为我会将“allSettled超时内”部分重构为一个实用程序函数,例如:
const fulfilledWithinTimeout = async (promises, timeout) => {
promises = Array.isArray(promises) ? promises : [...promises];
const all = await Promise.allSettled(promises.map(promise => Promise.race([promise, rejectAfterDelay(timeout)]));
return all.filter(({status}) => status === "fulfilled");
};
Run Code Online (Sandbox Code Playgroud)
然后
data.push(...await fulfilledWithinTimeout(promises, 5000));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |