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

Javascript 如何在NodeJs中为方法设置时间限制?,javascript,node.js,async-await,synchronous,Javascript,Node.js,Async Await,Synchronous,我有一个用例,在这个用例中,我从我的代码执行一个外部API调用, 我的代码进一步要求外部API的响应 我遇到了一个场景,外部API调用有时需要很长时间才能返回响应, 压缩我的代码以使其中断,这是一个无服务器的函数 因此,我想为外部API调用设置一个时间限制, 如果我在3秒内没有收到任何响应,我希望代码能够优雅地停止进一步的过程 以下是我试图执行的操作的伪代码,但无法理解逻辑- let test = async () => { let externalCallResponse = '

我有一个用例,在这个用例中,我从我的代码执行一个外部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();
参考-


我使用的是AWS SSM的getParameters方法

您不能等待
设置超时
,因为它不会返回
承诺

您可以实现一个函数,该函数返回一个
承诺
,并在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请求

功能超时(秒){
返回新承诺(解决=>{
设置超时(解析,秒*1000);
});
}
函数apiRequest(){
返回新承诺(解决=>{
setTimeout(()=>resolve('Hello World'),4000);
});
}
让测试=异步()=>{
让externalCallResponse='';
setTimeout(异步()=>{
externalCallResponse=等待apiRequest();
}, 0);
等待超时(3);//等待3秒
if(externalCallResponse!='')返回true;
否则返回false;
};
测试()
.then(res=>console.log(res))

.catch(err=>console.log(err.message))
您不能等待
设置超时
,因为它不会返回
承诺

您可以实现一个函数,该函数返回一个
承诺
,并在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请求

功能超时(秒){
返回新承诺(解决=>{
设置超时(解析,秒*1000);
});
}
函数apiRequest(){
返回新承诺(解决=>{
setTimeout(()=>resolve('Hello World'),4000);
});
}
让测试=异步()=>{
让externalCallResponse='';
setTimeout(异步()=>{
externalCallResponse=等待apiRequest();
}, 0);
等待超时(3);//等待3秒
if(externalCallResponse!='')返回true;
否则返回false;
};
测试()
.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)=>{
返回新承诺(异步(解析、拒绝)=>{
setTimeout(()=>reject(),毫秒);
解析(wait func());
});
}
const doStuffShort=async()=>{//运行1秒
返回新承诺((resolve)=>setTimeout(()=>resolve(),1000));
}
const doStuffLong=async()=>{//运行5秒
返回新承诺((resolve)=>setTimeout(()=>resolve(),5000));
}
超时(()=>doStuffShort(),3000)
。然后(()=>console.log('1已工作'))
.catch(()=>console.log('1超时');
超时(()=>doStuffLong(),3000)
.然后(()=>console.log('2已工作'))

.catch(()=>console.log('2超时')您可以这样做:

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)=>{
返回新承诺(异步(解析、拒绝)=>{
setTimeout(()=>reject(),毫秒);
解析(wait func());
});
}
const doStuffShort=async()=>{//运行1秒
返回新承诺((resolve)=>setTimeout(()=>resolve(),1000));
}
const doStuffLong=async()=>{//运行5秒
返回新承诺((resolve)=>setTimeout(()=>resolve(),5000));
}
超时(()=>doStuffShort(),3000)
。然后(()=>console.log('1已工作'))
.catch(()=>console.log('1超时');
超时(()=>doStuffLong(),3000)
.然后(()=>console.log('2已工作'))

.catch(()=>console.log('2超时')您可以这样使用,我创建了一个返回承诺的函数,然后我使用了这个承诺

let test=async()=>{
返回承诺超时()
}
常量承诺超时=()=>{
返回新承诺(异步(解析、拒绝)=>{
setTimeout(函数(){
让externalCallResponse=“”
externalCallResponse=等待externalCall();
如果(externalCallResponse!=''){
返回resolve(true);
}
否则{
返回解析(false);
}
}, 3000);
})
}
test()。然后(结果=>{
控制台日志(结果);
});

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

let test=async()=>{
返回承诺超时()
}
常量承诺超时=()=>{
返回新承诺(异步(解析、拒绝)=>{
setTimeout(函数(){
让externalCallResponse=“”
externalCallResponse=等待externalCall();
如果(externalCallResponse!=''){
返回resolve(true);
}
否则{
返回解析(false);
}
}, 3000);
})
}
test()。然后(结果=>{
控制台日志(结果);
});

您使用什么库进行查询?几乎每一个都有一个参数
timeout
这是否回答了您的问题@NikitaMadeev我使用的是AWS服务SSM的getParameters,它的计时超过了您用于查询的库?几乎每一个都有一个参数
timeout
这是否回答了您的问题@NikitaMadeev我用的是AWS服务