【问题标题】:Node JS, run same function after it is finishedNode JS,完成后运行相同的功能
【发布时间】:2017-06-07 05:29:54
【问题描述】:

如果有变化,我的应用程序需要每 2 秒轮询一次。现在我使用 setInterval,但有时myFunction 需要超过 2 秒才能执行,并且 mysql 数据库中的记录将被插入两次。我在 myFunction 中使用异步库..

所以我需要这个...

当 myFunction 完成时

method.myFunction() =>

它需要再次运行(但仅在完成时)。 setInterval 不能选择 x 秒。这是因为如果脚本花费的时间超过 x 秒,它们可以同时运行。

如何在 x 秒后再次运行 myFunction,但前提是 myFunction 处理完毕 所以在伪代码中是这样的

if method.myFunction == finished wait 2 seconds run method.myFunction again

【问题讨论】:

  • 可以分享代码sn-p

标签: javascript node.js asynchronous settimeout


【解决方案1】:

所以使用下面的代码,当函数执行结束时,你的方法将每秒调用一次。

function godMethod(){
    /* do what ever you want but call executor once you are done with everything */
    someCallbackForInsertion(data, function(){
        executor()
    })      
}

function executor(){
    setInterval(function(){
        godMethod()
    }, 2000);   
}

executor();

因此,您在服务器启动时调用执行程序,然后在 2 秒后调用 godMethod,然后执行您的插入/任何操作。插入成功后再次调用executor。

【讨论】:

  • 好的,谢谢。所以如果 godMethod 需要 5 秒来执行,它只是等待..?这将防止我的代码同时执行?
  • 是的,你的 godMethod 永远不会同时执行,它只会在前一个 godMethod 完成 2 秒后才执行。
  • 如果它有效,你能接受它作为答案吗?所以会对其他寻求相同的人有所帮助..
【解决方案2】:

使用回调,或者更好的是,Promises 让下一个轮询仅在前一个进程完成时执行。

【讨论】:

  • 我使用异步作为承诺
【解决方案3】:

我曾经修改过你的代码,它就像一个魅力......

var backup_timeout_seconds = 5000;
var main_rest_seconds = 2000;
function godMethod(timeout){


    var backuptimeout = setTimeout(function(){
        godMethod(main_rest_seconds);
        console.log("Called backup timeout, script is stuck...");
    }, backup_timeout_seconds);


    
    Pollforbids.pollForNewBids2(,function (err,res) {
        executor(timeout);
        clearTimeout(backuptimeout);
    });



}





function executor(interval){
    setTimeout(function(){
        godMethod(interval);
    }, interval);

}

godMethod(main_rest_seconds);

【讨论】:

  • 但是你为什么要从我的上面删除已回答的“打勾”标记?因为我回答了你的问题,你的问题解决了吗?
猜你喜欢
  • 2014-09-21
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2016-08-27
  • 2013-07-16
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
相关资源
最近更新 更多