Return 特定执行时间后的函数
Return for function after certain execution time
很清楚,如果重要的话,我会在 Node 中执行此操作。
我有一个方法可以进行一些同步调用(它们依赖于下一次调用的反馈,因此必须是同步的)并且我对环境或我正在调用的东西没有太多控制.
我需要在设定的时间(大约 3 秒)后 return 一个值,无论这些调用是否已完成。如果这些调用已完成,则脚本完成并 returns 值。一种备份超时,return 是一个可接受的(如果不完整)值,而不是由于服务器执行限制和抛出错误而完全超时。
我立即想到使用 setTimeout()
(如果未触发,则使用 clearTimeout()
)来执行 return。但是,return在 setTimeout 回调中输入一个值并不会结束我的脚本,而且 return 这个值,显然 - 那我怎么办?
//"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-catch-throw 设置:
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 的范围,因为它是异步的...所以到目前为止我的最佳想法是这样。
setTimeout 实际上并不像节点 js 事件循环那样工作。
使用上面的实现,setTimeout
中的回调将永远不会被调用,因为 clearTimeout
几乎会立即执行。倒计时时的 setTimeout 将允许执行脚本中的后续代码,这意味着 clearTimeout
将立即被调用,因为 scripttimmer
变量是真实的。
另一件需要注意的事情是,如果您打算中断 setTimeout
执行其回调,则应仅使用 clearTimeout
。
您可以尝试使用回调实现,这样您就可以像这样与 return 变量进行交互:
const myFunction = async callback => {
var scripttimer = setTimeout(function(){
callback("my value");
}, 3000);
return "did this anyways";
}
myFunction(val => console.log(val));
见执行here
此外,您应该避免使用 async
,除非您计划在函数中使用 await
。
如果您将 httpCall
函数中的延迟更改为小于 3 秒,那么您将获得 hello
的输出
如果 httpCall
中的延迟超过 3 秒,那么您将得到 bye
的输出
// Your Http Call Here which may take 3 seconds or more. eg.5 seconds
function httpCall(){
return new Promise((resolve,reject)=>{
setTimeout(function(){
resolve("hello")
},5000)
});
}
// your main function where you will be calling sync functions
function operation(){
return new Promise((resolve,reject)=>{
const timeoutID = setTimeout(function(){
resolve("bye")
},3000)
httpCall().then(result=>{
clearTimeout(timeoutID)
resolve(result)
})
});
}
// This is how you should call
operation().then((result)=>console.log(result))
很清楚,如果重要的话,我会在 Node 中执行此操作。
我有一个方法可以进行一些同步调用(它们依赖于下一次调用的反馈,因此必须是同步的)并且我对环境或我正在调用的东西没有太多控制.
我需要在设定的时间(大约 3 秒)后 return 一个值,无论这些调用是否已完成。如果这些调用已完成,则脚本完成并 returns 值。一种备份超时,return 是一个可接受的(如果不完整)值,而不是由于服务器执行限制和抛出错误而完全超时。
我立即想到使用 setTimeout()
(如果未触发,则使用 clearTimeout()
)来执行 return。但是,return在 setTimeout 回调中输入一个值并不会结束我的脚本,而且 return 这个值,显然 - 那我怎么办?
//"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-catch-throw 设置:
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 的范围,因为它是异步的...所以到目前为止我的最佳想法是这样。
setTimeout 实际上并不像节点 js 事件循环那样工作。
使用上面的实现,setTimeout
中的回调将永远不会被调用,因为 clearTimeout
几乎会立即执行。倒计时时的 setTimeout 将允许执行脚本中的后续代码,这意味着 clearTimeout
将立即被调用,因为 scripttimmer
变量是真实的。
另一件需要注意的事情是,如果您打算中断 setTimeout
执行其回调,则应仅使用 clearTimeout
。
您可以尝试使用回调实现,这样您就可以像这样与 return 变量进行交互:
const myFunction = async callback => {
var scripttimer = setTimeout(function(){
callback("my value");
}, 3000);
return "did this anyways";
}
myFunction(val => console.log(val));
见执行here
此外,您应该避免使用 async
,除非您计划在函数中使用 await
。
如果您将 httpCall
函数中的延迟更改为小于 3 秒,那么您将获得 hello
如果 httpCall
中的延迟超过 3 秒,那么您将得到 bye
// Your Http Call Here which may take 3 seconds or more. eg.5 seconds
function httpCall(){
return new Promise((resolve,reject)=>{
setTimeout(function(){
resolve("hello")
},5000)
});
}
// your main function where you will be calling sync functions
function operation(){
return new Promise((resolve,reject)=>{
const timeoutID = setTimeout(function(){
resolve("bye")
},3000)
httpCall().then(result=>{
clearTimeout(timeoutID)
resolve(result)
})
});
}
// This is how you should call
operation().then((result)=>console.log(result))