为什么 async.map 只传递我的 JSON 的值?

Why is async.map passing only the value of my JSON?

我在 node.js 中有一个函数如下所示:

exports.getAllFlights = function(getRequest) {

// this is the package from npm called "async"
async.map(clients, getFlight, function(err, results) {
    getRequest(results);
  });
}

变量 clients 应该是 JSON,如下所示: {'"A4Q"': 'JZA8187', "'B7P"': 'DAL2098' }

我希望 map 函数将变量 clients 数组的各个索引传递给 getFlight。但是,它传递了每个的值(例如:'DAL2098'、'JZA8187' 等等)。

这是预期的功能吗? async 中是否有一个函数可以满足我的要求?

getFlight的签名是getFlight(identifier, callback)。标识符是目前搞砸的。它returnscallback(null, rtn)。 null 表示不存在错误,rtn 表示我的函数产生的JSON。

首先创建一个自定义事件。附加 return 数据的侦听器。然后处理它。

var EventEmitter = require('events');
var myEmitter = new EventEmitter();



  myEmitter.emit('clients_data',{'"A4Q"': 'JZA8187'}); //emit your event where ever

  myEmitter.on('clients_data', (obj) => {
    if (typeof obj !=='undefined') {
        if (obj.contructor === Object && Object.keys(obj).lenth == 0) {
            console.log('empty');
        } else {
            for(var key in obj) {
            var value = obj[key];
            //do what you want here 
            }

        }
    }

});

是的,这是预期的结果。文档不是很清楚,但是 async.js 的所有迭代函数都传递可迭代的值,而不是键。有eachOf系列函数,既传键又传值。例如:

async.eachOf(clients, function (value, key, callback) {
    // process each client here
});

很遗憾没有mapOf

如果您不介意不并行处理事情,您可以使用 eachOfSeries:

var results = [];
async.eachOfSeries(clients, function (value, key, callback) {
   // do what getFlight needs to do and append to results array
}, function(err) {
  getRequest(results);
});

另一种(恕我直言更好)解决方法是使用适当的数组:

var clients = [{'A4Q': 'JZA8187'},{'B7P': 'DAL2098'}];

那就用你原来的逻辑吧。但是,我更喜欢使用如下结构:

var clients = [
    {key: 'A4Q', val: 'JZA8187'},
    {key: 'B7P', val: 'DAL2098'}
];

嗯,您需要先正确格式化您的客户对象,然后才能将其用于 async.map()Lodash _.map() 可以帮到你:

var client_list = _.map(clients, function(value, key) {
    var item  = {};
    item[key] = value;

    return item;
});

在那之后,你将得到一个像这样的数组:

[ { A4Q: 'JZA8187' }, { B7P: 'DAL2098' } ]

然后,您可以使用 async.map():

exports.getAllFlights = function(getRequest) {

  async.map(client_list, getFlight, function(err, results) {
    getRequest(results);
  });
};