异步.Filter在所有迭代器完成之前调用callback
async.filter is calling callback before all iterators finish
我使用的是caolan的async.js。我很困惑为什么回调会在所有迭代器完成之前被调用。当我运行以下代码时:
async.filter(matched_objects.fields, function(item, callback) {
console.log('checking field: ' + item.id);
if(item.id == 130 || item.id == 131) {
console.log('calling field true: ' + item.id);
callback(true);
}
callback(false);
},
function(fieldResults) {
console.log('fieldsResults.length=' + fieldResults.length);
});
得到以下输出:
checking field: 130
calling field true: 130
fieldsResults.length=1
checking field: 131
calling field true: 131
在过滤器循环中检查第二个results.fields
项之前,回调中的console.log被调用,这对我来说没有任何意义。
问题是每次都调用callback(false)
,即使您达到了if
条件。正确的方法是添加一个return
语句:
if(item.id == 130 || item.id == 131) {
console.log('calling field true: ' + item.id);
return callback(true); // now you won't call callback(false) everytime
}
callback(false);
你甚至可以这样缩短过滤器:
callback(item.id == 130 || item.id == 131);
经过更多的实验,我发现问题是回调(false);线。显然,这导致过滤器退出。我想这是有意义的,因为它强制回调被调用。
相关文章:
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何从Java/scala调用js美化程序
- 如何调用这个匿名 JavaScript 函数
- 如何从模块链中调用函数.导出到节点中
- 我需要从php调用javascript或jquery
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 单击按钮后如何逐个调用分区,上一个分区将隐藏
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- Rails完成了200 OK,但$.ajax()调用'错误'callback而不是'成功;
- node-phantom createPage()从不调用callback
- 如果jQuery.hide()在Deferred回调中被调用,Callback不会触发
- 在异步.直到(test, function, callback)测试函数没有被重复调用
- 显式调用javascript callback
- Opera不调用flash的ExternalInterface.callback()函数在js内部由flash调用的回调
- Cordova -plugin-device-motion插件不调用callback
- 谷歌.Load从不调用callback
- Jquery.post()中从未调用过Callback
- 异步.Filter在所有迭代器完成之前调用callback