javascript - 在特定执行时间后返回函数
问题描述
完全清楚,如果这很重要,我会在 Node 中执行此操作。
我有一个方法可以进行一些同步调用(它们依赖于下一次调用的反馈,因此必须是同步的),而且我对环境或我正在调用的东西没有太多控制权。
无论这些调用是否完成,我都需要在设定的时间(大约 3 秒)后返回一个值。如果这些调用已完成,则脚本完成并返回该值。一种备份超时,它返回一个可接受的(如果不完整)值,而不是由于服务器执行限制而完全超时并引发错误。
我立即想到使用 a setTimeout()
(clearTimeout()
如果它没有被绊倒,则使用 a )进行返回。但是,在 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的范围,因为它是异步的......所以到目前为止我最好的主意。
解决方案
如果您将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))
推荐阅读
- javascript - 如何通过 React 中的数字键从枚举中获取值
- django - 不使用 GenericForeignKey 的抽象 ForeignKey
- javascript - 如何从 Sharepoint Online 中的查找列中检索文本?
- python - scipy中的内存泄漏?
- sql - 使用sql删除项目名称中逗号(,)后的空格
- c++ - 我可以将类成员变量设置为类函数的结果吗?
- java - 如何使用 dialogflow.v2beta1 创建默认响应
- javascript - 如何将 JSON 数据添加到 HTML 文件
- postgresql - 如何更改/设置 Postgres 中的块大小?是否有任何文件可以进行配置?
- javascript - 将带有表单元素的 Jqgrid 发布到同一模型中