如何将时间限制应用于一系列回调函数

时间:2015-03-12 22:29:39

标签: node.js

你会如何对node.js中的一系列回调应用时间限制?

使用异步库会更容易吗?

谢谢你,你可以看到我正在努力使用异步javascript。

1 个答案:

答案 0 :(得分:0)

不要直接调用下一步,而是调用以下函数 doNext :您实际的下一步 stepData :您的参数加上执行时间限制(以毫秒为单位) unDoThis :如果必须撤消刚刚完成的工作,则要运行的功能

function nextStep(doNext, stepData, unDoThis) {

第一次设置超时

    if (!stepData.expireAt) {
        var currentDate = new Date();
        stepData.expireAt = currentDate.setMilliseconds(currentDate.getMilliseconds() + stepData.runMiliseconds);
        console.log(new Date().toISOString() +" We will expire at " 
                + new Date(stepData.expireAt).toISOString());
    };

记住如何撤消上一步完成的步骤

    if (!stepData.unDoAll) stepData.unDoAll = [];
    if (unDoThis) stepData.unDoAll.push(unDoThis);

如果时间已过,请撤消所有已完成的步骤

    if (new Date(stepData.expireAt) < new Date().getTime()) {
        while (stepData.unDoAll.length) {
            var unDoOne = stepData.unDoAll.pop();
            unDoOne();
        }
        console.log(new Date().toISOString() +' That was it!');

否则执行下一步

    } else {
        doNext(stepData, Array.prototype.slice.call(arguments, 2));
    }
}

从下面的工作者函数中,我们将建立我们将中断的链

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

function oneStep(stepData) {
    console.log (new Date().toISOString() +' ('+ stepData.nrIterations +') I do some stuff ');
    sleep(100);

    var myIteration = stepData.nrIterations--;
    if (stepData.nrIterations) {
        nextStep(otherStep, stepData);
    }
}

function otherStep(stepData) {
    console.log (new Date().toISOString() +' ('+ stepData.nrIterations +') I do more stuff, leaving a trace');
    sleep(100);

    var myIteration = stepData.nrIterations--;
    if (stepData.nrIterations) {
        nextStep(oneStep, stepData, function () {
            console.log(new Date().toISOString() +' ('+ myIteration +') I clean some trace ');
        });
    }
}

现在我们使用它。 使用runMiliseconds和nrIterations来查看效果

console.log (new Date().toISOString() + ' About to start ');
var currentDate = new Date();
nextStep(oneStep, {
    runMiliseconds : 250, 
    nrIterations: 22
});