异步数组函数
问题描述:
所以我有一个四个JSON对象的数组,我想向这些对象中的每个添加三个新的字段。为此,我需要为每个要添加的新字段设置一个异步函数。理想情况下,我想要做的是将异步函数限制为每次只更新两次。最后,回调原始函数并打印出新形成的数组。但我不能得到这个工作,虽然我觉得我靠近......异步数组函数
var async = require('async');
// My Array of JSON objects
var allIssues = [
{ id: '1', color: 'blue' },
{ id: '2', color: 'red' },
{ id: '3', color: 'gold' }
];
addExtraFeaturesToEachissue(allIssues, function(data) { console.log(data); });
function addExtraFeaturesToEachissue(allIssues, callback) {
async.each(
allIssues,
async.applyEach([addheight, addWidth, addWeight]),
callback(data)
);
}
function addHeight(issue, callback) {
setTimeout(function() {
issue.fields['height'] = "1000";
callback(issue);
}, 100);
}
function addWidth(issue, callback) {
setTimeout(function() {
issue['width'] = "100";
callback(issue);
}, 300);
}
function addWeight(issue, callback) {
setTimeout(function() {
issue.['weight'] = "500";
callback(issue);
}, 200);
}
答
假设调用的函数会做一些长期的任务,老实说,我不认为使用异步的需要,为什么不使用Promise?
// My Array of JSON objects
var allIssues = [
{ id: '1', color: 'blue' },
{ id: '2', color: 'red' },
{ id: '3', color: 'gold' }
];
addExtraFeaturesToEachissue(allIssues, function(data) { console.log(data); });
function addExtraFeaturesToEachissue(allIssues, callback) {
var requests = allIssues.map((issue) => {
return addHeight(issue).then(addWidth).then(addWeight);
});
Promise.all(requests).then((data) => console.log('done', data));
}
function addHeight(issue) {
return new Promise((resolve, reject) => {
setTimeout(function() {
issue.height = "1000";
resolve(issue);
}, 100);
});
}
function addWidth(issue) {
return new Promise((resolve, reject) => {
setTimeout(function() {
issue.width = "100";
resolve(issue);
}, 300);
});
}
function addWeight(issue) {
return new Promise((resolve, reject) => {
setTimeout(function() {
issue.weight = "500";
resolve(issue);
}, 200);
});
}
编辑我刚看到你whant末,整个阵列。正如Jared Smith所建议的那样,您可以使用Promise.all;)
+0
看看'Promise.all' ... –
请包括预期的JSON数组的形状。另外,为什么你选择异步方法并延迟使用超时填充JSON数组? –
[ {id:'1',color:'blue','width':100,'weight':'500',height:'1000'}, {id:'2',color:'red' ,'宽度':100,'重量':'500',高度:'1000}, {id:'3',颜色:'gold','width':100'weight':'500' :'1000} ]; 他们区域实际上更复杂的功能,我只是把一个随机计时器,以表明他们需要一段时间来执行 –