我正在尝试为流量控制目的实现一系列函数,但得到了意想不到的结果。我需要检查文件是否存在,结果是 Node 启动的 shell cmd,在 5000 毫秒的过程中。使用 Mixu 的Node book,我正在使用一个系列函数来进行顺序执行(第 7.2.1 节)。根据 Node 书籍,如果您需要将一个结果输入另一个结果,则此模式是合适的,但似乎并非如此,因为final()
在参数函数的任何回调返回之前执行。
下面应该是重现我所看到的内容所需的所有代码。
预期输出:(假设正在检查的文件是在 < 1000 毫秒内创建的)
1347312844082
真
1347312845082
真
1347312846083
真
1347312847082
真
1347312848082
真
<--console.log() 在系列函数的最后一个参数函数中的最后一个真结果。
实际输出:
1347312844082
1347312845082
1347312846083
1347312847082
1347312848082
false <-- 在系列参数回调之前评估系列函数的最后一个参数函数。
真的
真的
真的
真的
真的
我猜我的睡眠函数的回调(包含fs.check
调用)
args
由于系列函数的参数都被 slice.call(arguments) 调用而被推回- 然后转到最后一个函数,
- 最后处理回调。
但这似乎与 Node 书中描述的行为相矛盾。
注意:我试图避免回归到同步调用fs.existsSync
(
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); }