提问者:小点点

如何在NodeJS中为方法设置时间限制?


我有一个用例,其中我正在从我的代码执行外部API调用,
外部API的响应是我的代码所需要的。进一步

我遇到了一个场景,其中外部API调用有时要花费太长的时间才能返回响应,
将我的代码压缩为无服务器函数

因此,我想为外部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方法


共3个答案

匿名用户

您不能等待SetTimeout,因为它不返回Promise

您可以实现一个返回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函数的用法。 它模拟4秒后返回响应的api请求。

null

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));

匿名用户

您不能在setTimeout的非异步函数回调中使用await,而且setTimeout不返回承诺,您必须手动创建一个在指定时可以解析的承诺。 您想要做的事情的示例:

null

function externalCall(){
  return new Promise(res => setTimeout(res, 4000))
}

const test = () => {
    return new Promise(async (resolve) => {
      setTimeout(()=>resolve(false), 3000)
      await externalCall();
      resolve(true)
    });
}

test().then(console.log);

匿名用户

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

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);
});