我正在尝试为流量控制目的实现一系列函数,但会产生意外结果。我需要检查文件是否存在,结果是由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
次调用)
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); }