与对象并行的异步最后结果

时间:2016-02-24 16:39:49

标签: node.js node-async

我遇到异步并行问题。这是我目前的代码:

// 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);
        }
    });
}

1 个答案:

答案 0 :(得分:2)

无论_requestItem()函数体的内容是什么,如果{{1}的元素,响应数组元素上name属性的值不应该相同数组是唯一的。

我能看到的唯一错误是items被声明为全局变量,但这不应该是问题的原因。

我建议您在代码进入index循环之前检查items变量的内容(以查看它在此之前是否已损坏)。在这种情况下,调试是一个好主意。

更好的实施方式是:

for