2016-12-27 4 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); 

しかし、私はmodifiedDataでnullになっています。すべてのデータを取得するには?

答えて

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

ああ、thats made my day –

関連する問題