我正在编写一个脚本,用于从第三方服务请求库存物品,然后它必须根据特定条件对其进行过滤。虽然Filter
模块发回正确的响应,但调用Filter的方法无法将通过测试的项添加到数组中。NodeJS在回调之前等待
更具体地说,Inventory.loadClean()
从第三方API获取数据,然后它调用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);
});
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);
}
});
}
}
这是相当直截了当。 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的异步包装器。我知道这是造成问题,但我虽然通过使用多个回调脚本将工作如期。无论如何,请查看我的答案,关于我如何修复它。 – Meletis