首页 > 解决方案 > 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);,我无法调用最终回调。

标签: node.jsasync.js

解决方案


您可以在回调中使用标志变量,因为它将在范围内,并且您不需要在循环结束时手动调用回调。

只要没有发生错误,我们就会在每次迭代中调用不传递参数的回调。

在这种情况下,以这种方式使用 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}`);
    }
});

推荐阅读