【问题标题】:Node js to suspend execution of statement if takes longer than certain time如果需要超过一定时间,节点 js 暂停执行语句
【发布时间】:2021-03-18 20:08:15
【问题描述】:
如果需要超过一定时间,我想暂停执行语句。请帮我实现这个目标?
在下面给出的示例 sn-p 代码中,如果语句 const result = await curly.get('www.google.com'); 需要超过 2 秒的时间才能完成执行,我想暂停该语句的执行并抛出异常。
const { curly } = require('node-libcurl');
exports.curlFetch = async () => {
try {
const result = await curly.get('www.google.com');
return result;
} catch (err) {
console.error('----------ERRORR OCCURRED----------', err);
throw err;
}
}
【问题讨论】:
标签:
javascript
node.js
express
【解决方案1】:
您可以使用Promise.race()
我定义了一个timeout 函数,它返回一个承诺,该承诺在一定时间后被拒绝。如果请求更快,则结果将在 3 秒内得到解决,否则超时将被拒绝,您将进入 catch 块
const { curly } = require('node-libcurl');
exports.curlFetch = async () => {
try {
const request = curly.get('www.google.com');
const result = await Promise.race([request, timeout(3000)])
return result;
} catch (err) {
console.error('----------ERRORR OCCURRED----------', err);
throw err;
}
}
function timeout(ms) {
return new Promise((res, rej) => setTimeout(rej("Request took too long"), ms));
}
【解决方案3】:
正如其他人所建议的,Promise.race() 将在超时后继续执行脚本,但它不会停止您的 curly 函数的执行。验证这一点:
const wait = (t)=>new Promise((r,j)=> {
setTimeout(()=>r(t),t*1000)
});
Promise.race([
wait(1).then(console.log),
wait(5).then(console.log)
])
假设curly 对请求有一个中止功能,您可以这样做:
const TIMEOUT_SEC = 20;
const wait = (t)=>new Promise((r,j)=> {
setTimeout(()=>r(t),t*1000);
});
let req = curlyWhatever();
let handled = false;
await Promise.race([
req.then(()=>handled=true),
wait(TIMEOUT_SEC).then(()=>{
if(handled)
return;
req.abort();
// do whatever else
})
])