如果 Promise.allSettled 中的每个 Promise 需要超过 5 秒来解决,是否可以拒绝每个 Promise?

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)

T.J*_*der 6

您可以使用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)