一尘不染

异步/等待超时

node.js

我使用Node.js和TypeScript,并且使用async/await。这是我的测试用例:

async function doSomethingInSeries() {
    const res1 = await callApi();
    const res2 = await persistInDB(res1);
    const res3 = await doHeavyComputation(res1);
    return 'simle';
}

我想为整个功能设置一个超时时间。即如果要res1花费2秒,res2花费0.5秒,res3花费5秒,我想在3秒钟后让我抛出错误的超时。

正常setTimeout调用是一个问题,因为范围丢失了:

async function doSomethingInSeries() {
    const timerId = setTimeout(function() {
        throw new Error('timeout');
    });

    const res1 = await callApi();
    const res2 = await persistInDB(res1);
    const res3 = await doHeavyComputation(res1);

    clearTimeout(timerId);

    return 'simle';
}

而且我不能用普通的方式抓住它Promise.catch

doSomethingInSeries().catch(function(err) {
    // errors in res1, res2, res3 will be catched here
    // but the setTimeout thing is not!!
});

有关如何解决的任何想法?


阅读 245

收藏
2020-07-07

共1个答案

一尘不染

您可以使用Promise.race超时:

Promise.race([
    doSomethingInSeries(),
    new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 11.5e3))
]).catch(function(err) {
    // errors in res1, res2, res3 and the timeout will be caught here
})

您必须setTimeout将其包装在诺言中才能使用。

2020-07-07