2016-04-01 77 views
0

我正在使用Lodash來映射數組。在循環中,承諾從外部API獲取某些內容。Lodash的承諾

var array = _.map(data, function (d, i) { 
    getFromMyAPI(d[4]) 
    .then(function (results) { 
    return { 
     id: d[0], 
     zoneLat: d[2], 
     zoneLon: d[3], 
     wifiLat: results.a, 
     wifiLon: results.b 
    }; 
    }); 
}); 

不過呢,如果我做

​​

它顯示,當然,一個空數組。映射完成後,我怎麼能得到這個數組的內容?

回答

4

我敢打賭,你已經錯過事實getFromMyApi呼叫需要從一個迭代的說法......讓我們假設確實如此。

你應該把這個數組當作Promise的結果,它被鏈接到getFromMyAPI調用的所有結果。不知何故,最好的做法是使用一些先進的承諾庫,提供分類圖/減少承諾的功能版本,如藍鳥。

示例使用藍鳥:

var Promise = require('bluebird'); 
return Promise.map(data, function(d,i) { 
    return getFromMyApi(arguments, d).then(function(r) { 
     return { 
      id: d[0], 
      zoneLat: d[2], 
      zoneLon: d[3], 
      wifiLat: r.a, 
      wifiLon: r.b 
     }; 
    }) 
}).then(function(array) { 
    console.log("#2", array); 
}); 
+0

真棒,它完美的作品!謝謝 – Mencls

1

您忘記了從地圖功能返回。該數組不應該爲空,但應包含Promises。

1

更改像這樣,它應該工作:

var array = []; 
 
_.map(data, function (d, i) { 
 
    getFromMyAPI(d[4]) 
 
    .then(function (results) { 
 
    array.push({ 
 
     id: d[0], 
 
     zoneLat: d[2], 
 
     zoneLon: d[3], 
 
     wifiLat: results.a, 
 
     wifiLon: results.b 
 
    }); 
 
    }); 
 
});

編輯

+0

對不起,我忘了提及與地圖迭代器鏈接的說法,我已經更新了源代碼 – Mencls

+0

在您需要分配的值返回的情況。我編輯了代碼。 –