NodeJS在回调之前等待

时间:2017-07-30 13:38:36

标签: javascript node.js

我正在编写一个脚本,要求第三方服务中的商品包含库存,然后必须根据特定条件对其进行过滤。虽然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

我很确定它必须是异步的问题,但我不确定是否是由此引起的。

2 个答案:

答案 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循环中的变量forInventory.filter方法中表现得很奇怪。更具体地说它始终是31.不确定为什么会发生这种情况,但我很清楚我应该从inv[i]获取当前项目。相反,如果它通过所有条件,我会更改Filter.itemPasses以返回项目对象。我还添加了Jonas建议的代码。我不知道为什么它有效,但它的工作原理。没有它,数组总是空的。

不幸的是,我不知道为什么代码如此混乱的确切答案,但通过实现下面提到的修复我得到了它的工作。