【问题标题】:Node js to suspend execution of statement if takes longer than certain time如果需要超过一定时间,节点 js 暂停执行语句
【发布时间】:2021-03-18 20:08:15
【问题描述】:

如果需要超过一定时间,我想暂停执行语句。请帮我实现这个目标?

在下面给出的示例 sn-p 代码中,如果语句 const result = await curly.get('www.google.com'); 需要超过 2 秒的时间才能完成执行,我想暂停该语句的执行并抛出异常。

const { curly } = require('node-libcurl');

exports.curlFetch = async () => {
  try {
    const result = await curly.get('www.google.com');

    return result;
  } catch (err) {
    console.error('----------ERRORR OCCURRED----------', err);
    throw err;
  }
}

【问题讨论】:

标签: javascript node.js express


【解决方案1】:

您可以使用Promise.race()

我定义了一个timeout 函数,它返回一个承诺,该承诺在一定时间后被拒绝。如果请求更快,则结果将在 3 秒内得到解决,否则超时将被拒绝,您将进入 catch

const { curly } = require('node-libcurl');

exports.curlFetch = async () => {
  try {
    const request = curly.get('www.google.com');
    const result = await Promise.race([request, timeout(3000)])
  
    return result;
  } catch (err) {
    console.error('----------ERRORR OCCURRED----------', err);
    throw err;
  }
}


function timeout(ms) {
   return new Promise((res, rej) => setTimeout(rej("Request took too long"), ms));
}

【讨论】:

    【解决方案2】:

    来自msdn

    Promise.race() 方法返回一个承诺,一旦可迭代中的一个承诺履行或拒绝,该承诺就会履行或拒绝,并带有来自该承诺的价值或原因。

    const fetchWithTimeout =  (url, options, timeout = 2000) => {
        return Promise.race([
            fetch(url, options),
            new Promise((_, reject) =>
                setTimeout(() => reject(new Error('timeout')), timeout)
            )
        ]);
    }
    
    
    await fetchWithTimeout('www.google.com',{})
    

    进一步阅读:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race

    【讨论】:

      【解决方案3】:

      正如其他人所建议的,Promise.race() 将在超时后继续执行脚本,但它不会停止您的 curly 函数的执行。验证这一点:

      const wait = (t)=>new Promise((r,j)=> {
        setTimeout(()=>r(t),t*1000)
      }); 
      Promise.race([ 
        wait(1).then(console.log),
        wait(5).then(console.log)
      ])
      

      假设curly 对请求有一个中止功能,您可以这样做:

      const TIMEOUT_SEC = 20;
      const wait = (t)=>new Promise((r,j)=> {
        setTimeout(()=>r(t),t*1000);
      });
      let req = curlyWhatever();
      let handled = false;
      await Promise.race([
        req.then(()=>handled=true),
        wait(TIMEOUT_SEC).then(()=>{
          if(handled)
            return;
          req.abort();
          // do whatever else
        })
      ])
      

      【讨论】:

        猜你喜欢
        • 2016-02-13
        • 2017-09-05
        • 1970-01-01
        • 2012-02-06
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-02
        相关资源
        最近更新 更多