node.js - Node.js async.each 没有调用回调函数
问题描述
我在 node.js 中的 aysnc 函数中遇到了一些问题。下面是我的代码:
let async = require("async");
let list1 = {
"aaa": true,
"bbb": true
}
let list2 = [{
"name": "aaa"
}, {
"name": "bbb"
}];
let flag = true;
let i = 0;
async.each(list2, function (activity, callback) {
if (!list1[activity['name']]) {
flag = false;
}
i++;
if (i === list2.length) {
callback(null);
//callback("error");
}
}, function (err) {
console.log(err);
console.log("completed callback");
//need the value of flag to execute my business logic
});
如果值都true
在 list1 中,那么 flag 的值为true
,我将根据 flag 执行我的业务逻辑。而且我还设置了一个i
判断是否是最后一个循环,所有循环执行完毕,我要调用回调。但是发生了一些奇怪的事情,如果我设置callback("error");
我可以调用最终回调。如果我设置callback(null);
,我无法调用最终回调。
解决方案
您可以在回调中使用标志变量,因为它将在范围内,并且您不需要在循环结束时手动调用回调。
只要没有发生错误,我们就会在每次迭代中调用不传递参数的回调。
在这种情况下,以这种方式使用 flag 是安全的,因为我们只会在逻辑需要时将其设置为 false。
let async = require("async");
let list1 = {
"aaa": true,
"bbb": true
}
let list2 = [{
"name": "aaa"
}, {
"name": "bbb"
}];
// Assume flag is initally true.
let flag = true;
async.each(list2, function (activity, callback) {
if (!list1[activity['name']]) {
flag = false;
}
// Pass an error if it occurs.
callback();
}, function (err) {
if (err) {
console.error("An error occurred: ", err);
} else {
// You can use flag in your business logic now.
console.log(`Completed callback: flag: ${flag}`);
}
});
推荐阅读
- xamarin - Xamarin iOS 中的自定义振动
- git - 将远程服务器目录与本地 git 存储库同步
- java - 任何Java公式/类可以使位置变化平滑?[JAVA]
- testing - 创建端到端自动化测试的最佳方式
- c++ - -Wno-pedantic 在旧版 gcc 上被忽略
- c# - c# xml注释,cref不能引用基类中定义的方法
- birt - 如何将 birt 报告放在 PDF 的一页中
- c# - 如何使用来自另一个列表的值附加到字符串列表?
- javascript - 等待过滤器完成
- python - 在 Jupyter 中显示的度数符号,但在其他任何地方都没有 - Python