如何为NodeJs中的方法设置时间限制?

How to set a time limit to a method in NodeJs?

我有一个用例,我正在通过我的代码进行外部 API 调用,
外部 API 的响应是我的代码进一步

我遇到了一个场景,外部 API 调用有时花费的时间太长以至于 return 没有响应,
将我的代码设置为无服务器函数

所以我想给外部API调用设置一个时间限制,
如果我在 3 秒内没有得到任何响应,我希望代码能够优雅地停止进一步的过程

以下是我正在尝试做的伪代码,但无法弄清楚逻辑 -

let test = async () => {
    let externalCallResponse = '';

    await setTimeout(function(){ 

        //this call sometimes takes for ever to respond, but I want to limit just 3secs to it
        externalCallResponse = await externalCall();
    }, 3000);

    if(externalCallResponse != ''){
        return true;
    }
    else{
        return false;
    }
}

test();

参考-
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SSM.html#getParameters-property
我正在使用 AWS SSM 的 getParameters 方法

您不能等待 setTimeout,因为它不会 returns Promise

您可以实现一个 returns 一个 Promise 的函数,该函数在 3 秒后完成。

function timeout(seconds) {
   return new Promise((resolve) => {
       setTimeout(resolve, seconds * 1000)
   });
}

你可以在你的代码中等待上面的函数传递你想要等待的秒数

let test = async () => {
    let externalCallResponse = ''; 
    
    setTimeout(async () => {
       externalCallResponse = await externalCall();
    }, 0);

    await timeout(3); // wait for 3 seconds 

    if(externalCallResponse != '') return true;
    else return false;
}

以下代码片段演示了上面编写的 timeout 函数的用法。它模拟一个 api 请求 returns 4 秒后响应。

function timeout(seconds) {
  return new Promise(resolve => {
    setTimeout(resolve, seconds * 1000);
  });
}

function apiRequest() {
  return new Promise(resolve => {
    setTimeout(() => resolve('Hello World'), 4000);
  });
}

let test = async () => {
  let externalCallResponse = '';

  setTimeout(async () => {
    externalCallResponse = await apiRequest();
  }, 0);

  await timeout(3); // wait for 3 seconds

  if (externalCallResponse != '') return true;
  else return false;
};

test()
  .then(res => console.log(res))
  .catch(err => console.log(err.message));

你可以这样做:

const timeout = async (func, millis) => {
   return new Promise(async (resolve, reject) => {
      setTimeout(() => reject(), millis);

      resolve(await func());
   });
}

timeout(() => doStuff(), 3000)
   .then(() => console.log('worked'))
   .catch(() => console.log('timed out'));

测试:

const timeout = async (func, millis) => {
   return new Promise(async (resolve, reject) => {
      setTimeout(() => reject(), millis);

      resolve(await func());
   });
}

const doStuffShort = async () => { // Runs for 1 second
  return new Promise((resolve) => setTimeout(() => resolve(), 1000));
}

const doStuffLong = async () => { // Runs for 5 seconds
  return new Promise((resolve) => setTimeout(() => resolve(), 5000));
}

timeout(() => doStuffShort(), 3000)
   .then(() => console.log('1 worked'))
   .catch(() => console.log('1 timed out'));
   

timeout(() => doStuffLong(), 3000)
   .then(() => console.log('2 worked'))
   .catch(() => console.log('2 timed out'));

你可以使用这样的东西,我创建了一个函数,return 一个承诺然后我使用了这个承诺。

let test = async () => {

    return promiseTimeout()
}

const promiseTimeout = () => {
    return new Promise(async (resolve, reject) => {
        setTimeout(function () {
            let externalCallResponse=""
            externalCallResponse = await externalCall();
            if (externalCallResponse != '') {
                return resolve(true);
            }
            else {
                return resolve(false);
            }
        }, 3000);
    })
}

test().then(result=>{
    console.log(result);
});