【问题标题】:How to add timeout to this async function如何为此异步函数添加超时
【发布时间】:2021-03-25 10:38:44
【问题描述】:

我想添加一个超时,这样如果这些“任务”中的任何一个花费超过 5 分钟,它应该停止该功能并解决承诺。我一直在努力,任何帮助表示赞赏。谢谢!

if (require.main === module) {
  (async () => {
    const tasks = [];
    for (let i = 1; i <= NB_PARALLEL; i++) {
      tasks.push(buildReferenceSpaceCollection(json));
    }
    const results = await Promise.all(tasks);
    console.log(results);
    process.exit(0);
  })().catch(console.error);
}

【问题讨论】:

    标签: node.js asynchronous promise timeout


    【解决方案1】:

    您可以定义一个在给定时间后拒绝的wait-函数,然后在该wait-函数和您的Promise.all 上使用Promise.race。现在,如果你在Promise.all 中的承诺比wait 花费的时间长,Promise.race 将拒绝,否则解析的值将分配给results

    function wait(ms) {
        return new Promise((_, reject) => {
            setTimeout(() => {
               reject(new Error("wait time exceeded"));
            }, ms);
        })
    }
    
    (async () => {
        const tasks = [];
        for (let i = 1; i <= NB_PARALLEL; i++) {
          tasks.push(buildReferenceSpaceCollection(json));
        }
        // 5 mins in ms
        const wait5MinPromise = wait(5*60*1000);
        const results = await Promise.race([wait5MinPromise, Promise.all(tasks)]);
        console.log(results);
        process.exit(0);
      })().catch(console.error)
    

    ;

    【讨论】:

    • 非常感谢!!
    • 很高兴为您提供帮助,请不要忘记点击左侧的复选标记接受答案,谢谢:)
    【解决方案2】:

    只是为了好玩(Live demo):

    import { CPromise } from "c-promise2";
    
    const generateYourAsyncTaskHereToAddInQueue= async (value)=> {
        console.log(`Inner task started [${value}]`);
        await CPromise.delay(1000);
        return value;
    }
    
    (async () => {
        const results = await CPromise.all(function* () {
            for (let i = 0; i < 10; i++) {
                yield generateYourAsyncTaskHereToAddInQueue(`Task result ${i}`);
            }
        }, {concurrency: 3}).timeout(5000);
    
        console.log(`results:`, results);
    
        return results;
    })().catch(console.error);
    

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 2011-01-12
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      相关资源
      最近更新 更多