2016-12-27 245 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

唉,这就是我的一天 –