我遇到异步并行问题。这是我目前的代码:
// Tasks object for async
var Tasks = {};
// Go through the items
for(index in items) {
var itemName = items[index];
Tasks[index] = function(callback) {
self._requestItem(currency, appID, itemName, function(err, item) {
if( err) {
callback(err, null);
return;
}
callback(null, { "name": itemName, "data": item });
});
}
}
// Go through tasks, using async parallel
this._async.parallel(Tasks, function(err, results) {
console.log(err, results);
});
每个items
条目都是唯一的。但是当并行完成时,它会显示最后一个结果。例如,如果items
中有3个项目,则异步results
输出0,1与2相同。
null { '0':
{ name: 'Test 3',
data:
{ success: true,
price: 17.02 } },
'1':
{ name: 'Test 3',
data:
{ success: true,
price: 17.02 } },
'2':
{ name: 'Test 3',
data:
{ success: true,
price: 17.02 } } }
为什么这样做?如果我在items
中使用2个项目,则会再次将结果从1复制到0。
根据要求添加_requestItem
代码段。
Manager.prototype._requestItem = function(currency, appID, itemName, callback) {
var self = this;
this._request({
uri: this._uri,
baseUrl: this._baseUrl,
json: true
}, function(err, res, body) {
if( ! err && res.statusCode !== 200) {
if(self._errorCodes[res.statusCode] !== undefined) {
callback(self._errorCodes[res.statusCode], null);
} else {
callback('Unsuccessful response (' + res.statusCode + '). Is the API having issues?', null);
}
} else if( ! err && res.statusCode === 200) {
callback(null, body);
} else {
callback(err, null);
}
});
}
答案 0 :(得分:2)
无论_requestItem()
函数体的内容是什么,如果{{1}的元素,响应数组元素上name
属性的值不应该相同数组是唯一的。
我能看到的唯一错误是items
被声明为全局变量,但这不应该是问题的原因。
我建议您在代码进入index
循环之前检查items
变量的内容(以查看它在此之前是否已损坏)。在这种情况下,调试是一个好主意。
更好的实施方式是:
for