在数组中收集Api返回

时间:2016-07-25 12:53:45

标签: javascript node.js asynchronous

我正在调用第三方api,我在收集所有返回时遇到问题并将其作为1个数组返回到我的API中。我可以看到我成功拨打电话他们正在返回。由于asynch,最终数组在填充之前返回。有一个优雅的解决方案来处理这个?

var itemIds = ['1','2','3','4','5','6']

exports.getItemData = function getItemData(req, res) {
    var items = [];
    var errors = [];

    for(var itemId in itemIds) {
        var options = {
            uri: itemEndpoint + itemIds[itemId] +'/',
           json: true
        };

        RequestPromise(options).then(function (item){
            console.log(item);
            items.push(item);

        }).catch(function(err){
            console.log(err)
            errors.push(err);

        });
    };
    res.type('application/json');
    res.json(items);
};

1 个答案:

答案 0 :(得分:3)

菲利克斯是对的。您需要创建一个RequestPromise(options) Promises数组,然后使用Promise.all([array-of-promises]).then(function (<array-of-result-arrays>){})

因此,您重构的代码将如下所示:

var allPromises = [];
for(var itemId in itemIds) {
        var options = {
            uri: itemEndpoint + itemIds[itemId] +'/',
           json: true
        };
        allPromises .push(RequestPromise(options));
}
//so now you have an array of promises in allPromises. Now when they all resolve:
Promise.all(allPromises).then(function (allResults){
       console.log(allResults);
       //do whatever with the results...
   }).catch(function(err){
       console.log(err)
       errors.push(err);
   });

我希望这会有所帮助。