我正在编写一个脚本,要求第三方服务中的商品包含库存,然后必须根据特定条件对其进行过滤。虽然Filter
模块发回正确的响应,但调用Filter的方法无法将已通过测试的项添加到数组中。
更具体地说,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
的if语句:Underscore _.each callback when finished?
并且想法是在处理最后一个元素时调用回调。虽然它的工作似乎很合乎逻辑,但它并不合适。我仍然得到一个空阵列。
请注意,我已检查Filter
内的所有方法,并且他们正在正确评估。万一你想看到filter.js
这里有一个链接:https://gist.github.com/meletisf/d32a241ba2cbb168527f4342eabdf2a6
我很确定它必须是异步的问题,但我不确定是否是由此引起的。
答案 0 :(得分:0)
这可能是种族问题。这可能是回调的更好条件,也是闭包i:
filter: function (inv, rules, cb) {
var filtered_items = [];
var count=0;
for(let i = 0; i < inv.length; i++) {//the let is important
Filter.itemPasses(inv[i], rules, function(passes, stage) {
//console.log(passes, stage);
if(passes) {
filtered_items.push(inv[i]);
}
count++;
if(count == inv.length) {//the improved condition
console.log("i+1:", i+1, "inv:", inv.length);
cb(filtered_items);
}
});
}
}
答案 1 :(得分:0)
在试图检查每个变量的行为后,我偶然发现了以下结论。
i
循环中的变量for
在Inventory.filter
方法中表现得很奇怪。更具体地说它始终是31.不确定为什么会发生这种情况,但我很清楚我应该从inv[i]
获取当前项目。相反,如果它通过所有条件,我会更改Filter.itemPasses
以返回项目对象。我还添加了Jonas建议的代码。我不知道为什么它有效,但它的工作原理。没有它,数组总是空的。
不幸的是,我不知道为什么代码如此混乱的确切答案,但通过实现下面提到的修复我得到了它的工作。