Javascript 如何在NodeJs中为方法设置时间限制?
我有一个用例,在这个用例中,我从我的代码执行一个外部API调用,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调用设置一个时间限制,
如果我在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服务