为什么 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);
});
};
我在 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);
});
};