2016-12-27 203 views
0

我正在使用lodash庫進行迭代。爲此,我使用了_.map()函數。我有一個問題,我在_.map()中有一個異步函數。我的代碼是這樣的:在_.map()中使用異步函數

let dataToRender = {}; 
let modifiedData = _.map(myArray, (element) => { 
     dataToRender.uuid = element.UID; 
     dataToRender.pendingAmountReceived = element.$.SR; 
     dataToRender.orderID = element.TransactionID; 
     dataToRender.orderAmount = element.TransactionValue; 
     dataToRender.orderDate = moment(element.TransactionTime, 'YYYY-MM-DDTHH:mm:ss'); 
     dataToRender.goal = element.Product.replace('amp;', '&'); 
     dataToRender.currentStatus = 'waiting'; 

     //Here CheckFilter is my asynchrounous function 
     //I have to do calculation base on the response of this checkFilter 

     checkFilter(requireParams) 
     .then(data => { 
      //If the response returned from checkFilter is false I have to include this data 
      if (!data) { 
      return requireParams; 
      } 
     }); 
    }); 
res.json(modifiedData); 

但我剛剛null在modifiedData中。如何獲取所有數據?

回答

2

Bluebird提供了許多承諾幫手方法,其中包括Promise.map(),這些方法只有在所有返回的承諾都解決後才能解決。

唯一的問題是,如果checkFilter函數真的很簡單,那麼結果會是undefined。 lodash的_.compact函數可以在這裏幫助,或者如果您有更具體的過濾需求,則可以使用_.filter

const Promise = require('bluebird'); 
let dataToRender = {}; 
Promise.map(myArray, element => { 
    dataToRender.uuid = element.UID; 
    dataToRender.pendingAmountReceived = element.$.SR; 
    dataToRender.orderID = element.TransactionID; 
    dataToRender.orderAmount = element.TransactionValue; 
    dataToRender.orderDate = moment(element.TransactionTime, 'YYYY-MM-DDTHH:mm:ss'); 
    dataToRender.goal = element.Product.replace('amp;', '&'); 
    dataToRender.currentStatus = 'waiting'; 

    return checkFilter(requireParams) 
    .then(data => { 
     // If the response returned from checkFilter is false I have to include this data 
     if (!data) return requireParams; 
    }); 
}) 
.then(results => res.json(_.compact(results))); 
+0

唉,這就是我的一天 –