【问题标题】:nodejs: force callback execution if method hangsnodejs:如果方法挂起,则强制执行回调
【发布时间】:2016-03-01 10:49:05
【问题描述】:

我有一种情况,我的来自第三方库的异步 nodejs 方法耗时太长。我想为此调用设置一个超时限制,如果它没有在该超时内返回,我希望使用默认(空)值进行回调。

当前代码

wrapperfunct(data, function(value, err) {
  //do everything with value or err
})


wrapperfunc(data, callback) {
      thirdpartylib.getData(input, callback)
    }

我注意到 getData 有时会挂起,这会阻止回调发生。我想要一个行为,而不是 getData 在指定时间内没有调用回调方法,我用默认值调用回调,比如 (null, null)。

【问题讨论】:

    标签: node.js callback


    【解决方案1】:

    您可以像这样设置自己的超时时间:

    wrapperfunc(obj, timeout, data, callback) {
       var done = false;
       var timer = setTimeout(function() {
           done = true;
           // callback with both values null to signify a timeout
           callback(null, null);
       }, timeout);
       obj.thirdpartylib.getData(input, function(err, data) {
           if (!done) {
               clearTimeout(timer);
               done = true;
               callback(err, data);
           }
       })
    }
    

    注意:您提议的函数中this 的值可能不正确,因此我替换了obj。您要么必须传入该值,要么必须使用范围内的某个变量。

    【讨论】:

    • 谢谢,我是否也需要在 setTimeout() 中进行类似的检查,例如 setTimeout(fucntion() { if(!done) { done= true, callback(null,null);} , 暂停); :)
    • @jsfriend00 第三方库回调及时完成,setTimeout内的回调不会被调用吗?
    • @blazesahlzen - 查看 clearTimeout 使得它在这种情况下不会触发超时。
    • 哦,是的,我好像错过了。
    • @konquestor - 如果第三方调用成功,请参阅clearTimeout(),它会停止计时器触发。因此,除非第三方调用尚未完成,否则它永远不会触发。
    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多