フロー制御の目的で一連の関数を実装しようとしていますが、予期しない結果が得られます。ファイルの存在を確認する必要があります。その結果、ノードによって開始されたシェルcmdが、たとえば5000ミリ秒の間に発生します。Mixuのノードブックを使用して、順次実行にシリーズ関数を使用しています(セクション7.2.1)。ノードブックによると、ある結果を別の結果にフィードする必要がある場合、このパターンは適切ですがfinal()
、引数関数からのコールバックが返される前にが実行されているため、そうではないようです。
以下は、私が見ているものを再現するために必要なすべてのコードです。
期待される出力:(チェック対象のファイルが1000ミリ秒未満で作成されたと想定)
1347312844082
true
1347312845082
true
1347312846083
true
1347312847082
true
1347312848082
true
true <-シリーズ関数の最後のparam関数のconsole.log()の最後のtrue結果。
実際の出力:
1347312844082
1347312845082
1347312846083
1347312847082
1347312848082false
<-シリーズ引数コールバックの前に評価されているシリーズ関数の最後のパラメーター関数。
真真
真真
真真
_
_
スリープ関数(呼び出しを含む)からのコールバックを推測していますfs.check
args
級数関数のパラメータがすべてslice.call(arguments)によって呼び出された結果としてプッシュバックされています- 次に、最後の関数にシフトします。
- そして最後にコールバックを処理します。
しかし、これはノードブックに記述されている動作に関して矛盾しているようです。
注:私は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); }