【发布时间】:2019-05-07 20:22:15
【问题描述】:
完全清楚,如果这很重要,我会在 Node 中执行此操作。
我有一个方法可以进行一些同步调用(它们依赖于下一次调用的反馈,所以必须是同步的),我对环境或我正在调用的东西没有太多控制权。
无论这些调用是否完成,我都需要在设定的时间(大约 3 秒)后返回一个值。如果这些调用已完成,则脚本完成并返回该值。一种备份超时,它返回一个可接受的(如果不完整的)值,而不是由于服务器执行限制而完全超时并引发错误。
我立即想到使用setTimeout()(如果没有跳闸,则使用clearTimeout())进行返回。但是,在 setTimeout 回调中返回一个值并不会结束我的脚本并返回该值,显然 - 那我该怎么办?
//"myFunction" being consumed by something I don't have control over
//Otherwise I'd just wrap the caller in a timeout
myFunction = async () => {
var scripttimer = setTimeout(function(){
//emergency exit - script took longer than 3 seconds
return "I need to return a value for myFunction now";
}, 3000);
//multiple synchronous remote https calls are made
//right here which could sometimes cause this function
//to take more than 3 seconds, at which point the
//scripttimer should kill myFunction by making it return
//a value. That's the part that I'm asking how to do, if
//even possible
if (scripttimer){
//if we took less than 3 seconds, we don't need the backup
//callback in scripttimer and so we're going to kill it
clearTimeout(scripttimer);
}
//best scenario return value, script took less than 3 seconds
return "did this anyways";
}
试过
想做一个尝试-接住-投掷设置:
try {
var scripttimer = setTimeout(function(){
throw "I need to return a value for myFunction now";
}, 3000);
//wait 4 seconds maybe
if (scripttimer){
clearTimeout(scripttimer);
}
return "I don't make it out if I take too long";
} catch (e){
return "acceptable enough";
}
...但是 catch 没有捕捉到它,这有点道理,因为抛出的错误超出了 try-catch 的范围,因为它是异步的......所以到目前为止我最好的想法是。
【问题讨论】:
-
如果您包含更多关于您希望通过超时异步调用的函数的详细信息,这可能会有所帮助。
-
@ctt 这个函数 (
myFunction) 是被调用的函数。它在内部做什么可能无关紧要,但只是几个 https 调用和围绕它们的一堆逻辑有时需要太长时间。
标签: javascript node.js return settimeout