[英]How to set a time limit to a method in NodeJs?
我有一個用例,我正在通過我的代碼進行外部 API 調用,
我的代碼進一步需要外部 API 的響應
我遇到了一個場景,外部 API 調用有時需要太長時間才能返回響應,
將我的代碼設置為無服務器 function
所以我想給外部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
,因為它不會返回Promise
。
您可以實現一個 function,它返回Promise
,它會在 3 秒后完成。
function timeout(seconds) {
return new Promise((resolve) => {
setTimeout(resolve, seconds * 1000)
});
}
您可以在代碼中等待上面的 function 傳遞您要等待的秒數
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
function 的用法。 它模擬 api 請求,該請求在 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'));
你可以使用這樣的東西,我創建了一個返回 promise 的 function,然后我使用了這個 promise。
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);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.