Node.js中使用Series函数实现流控制的意外结果(模式?)

时间:2012-09-10 22:13:15

标签: javascript node.js asynchronous

我正在尝试为流量控制目的实现一系列函数,但会产生意外结果。我需要检查文件是否存在,结果是由Node启动的shell cmd,比如5000毫秒。使用Mixu的Node book我正在使用一系列函数进行顺序执行(第7.2.1节)。根据Node书,如果你需要一个结果输入另一个结果,这个模式是合适的,但是在参数函数的任何回调返回之前执行final()似乎不是这种情况。

下面应该是重现我所看到的所有代码。

预期输出 :(假设要检查的文件是在< 1000ms内创建的)

  

1347312844082
  真正
  1347312845082个
  真正
  1347312846083个
  真正
  1347312847082个
  真正
  1347312848082个
  真正
  true< - 系列函数的最后一个param函数中的console.log()的最后一个真实结果。

实际输出

  

1347312844082
  1347312845082个
  1347312846083个
  1347312847082个
  1347312848082个
  false< - 系列函数的最后一个param函数,在系列args回调之前被评估   真正
  真正
  真正
  真正
  真

我正在猜测来自我的睡眠功能的回调(其中包含fs.check次调用)

    由于slice.call(arguments)调用了系列函数的args param,
  • 被推回了
  • 然后转到最后一个功能,
  • 最后处理回调。

但这似乎与Node书中描述的行为相矛盾。

注意:我试图避免回归同步调用(fs.existsSync)以试图打破我的大脑,并且可能最终“得到它”到Node /异步编程。

    var outputFile = 'C:\\Some\\Valid\\Path\\foo.txt';
    var successCheck = false;
    series([
            sleep(1000, function () {
                printTime();
                fs.exists(outputFile, function (exists) {
                    console.log(exists);
                    successCheck = exists;
                });
            }),
            /* middle three deleted for brevity */
            sleep(1000, function () {
                printTime();
                fs.exists(outputFile, function (exists) {
                    console.log(exists);
                    successCheck = exists;
                });
            }),

            sleep(1000, function () {
                printTime();
                fs.exists(outputFile, function (exists) {
                    console.log(exists);
                    successCheck = exists;
                });
            })
            ], function() {
                console.log(successCheck);
        });


    function sleep (msInterval, callback) {
        var now = new Date().getTime();
        while(new Date().getTime() < now + msInterval) {
      // do nothing
        }
        callback();
    }

    function series (callbacks, last)  {
        var results = [];
        function next() {
            var callback = callbacks.shift();
            if(callback) {
                callback(function() {
                    results.push(Array.prototype.slice.call(arguments));
                    next();
                });
            } else {
                last(results);
            }
        }

        next();
    }

    function printTime () { var now = new Date().getTime(); console.log(now); }

0 个答案:

没有答案