私はサードパーティのサービスからアイテムを内部に持っているインベントリを要求し、特定の基準に基づいてそれらをフィルタリングするスクリプトを作成しています。 Filter
モジュールは正しい応答を返送しますが、フィルターを呼び出すメソッドは、テストに合格した項目を配列に追加できません。コールバック前にNodeJSが待機する
具体的には、Inventory.loadClean()
はサードパーティのAPIからデータを取得してから、項目をループして条件を満たしているかどうかを確認するInventory.filter
を呼び出します。項目がそれをするならば、配列にそれを加えます。
filter: function (inv, rules, cb) {
var filtered_items = [];
for(var i = 0; i < inv.length; i++) {
Filter.itemPasses(inv[i], rules, function(passes, stage) {
//console.log(passes, stage);
if(passes) {
filtered_items.push(inv[i]);
}
if(i + 1 == inv.length) {
console.log("i+1:", i+1, "inv:", inv.length);
cb(filtered_items);
}
});
}
}
Inventory.filter
メソッドの呼び出し
// This is how Intentory.filter is called. All the parameters are correct.
Inventory.filter(inv, rules, function(filtered) {
console.log(filtered);
next(filtered);
});
それはかなりまっすぐ進むのです。 Filter.itemPasses
がアイテムを評価し、コールバックで値がpasses
であるかどうかは、アイテムがチェックを通過するかどうかに基づいて真または偽です。
ザ・表現i + 1 == inv.length
を評価文がここに発見された場合:Underscore _.each callback when finished?
とアイデアが最後の要素が処理されるときにコールバックを呼び出すことです。それが動作することは非常に論理的なようですが、そうではありません。私はまだ空の配列を取得しています。
私はFilter
のすべてのメソッドをチェックしており、正しく評価していることに注意してください。場合によっては、filter.js
がリンクになっています。https://gist.github.com/meletisf/d32a241ba2cbb168527f4342eabdf2a6
私はそれが非同期の問題であることは間違いないと確信していますが、原因はわかりません。
'Filter.meetsPriceLimits'は' Cache.get() 'を呼び出しています。この関数が非同期で応答することは可能でしょうか? 'resp'パラメータを持つコールバックは、その疑いを引き起こす可能性があります。 – ccprog
はい。 'Cache.get()'私はRedisの非同期ラッパーです。私はこれが問題を引き起こしていることを知っていましたが、複数のコールバックを使用することによって、スクリプトはitentedとして機能します。とにかく、私はそれを固定した方法について私の答えをチェックしてください。 – Meletis