2016-12-01 59 views
-1

我正在使用bluebird & lodash並試圖弄清楚如何在迭代對象後返回承諾?例如,我想添加一個鍵/值對每個對象,我想打印結果後,再爲其添加一個鍵/值對每個對象:如何在javascript中迭代對象後返回承諾

var cars = { 
     audi:[ 
      { 
       model:'r8', 
       year:'2012' 
      }, 
      { 
       model:'rs5', 
       year:'2013' 
      } 
     ], 
     ford:[ 
      { 
       model:'mustang', 
       year:'2012' 
      }, 
      { 
       model:'fusion', 
       year:'2015' 
      } 
     ], 
     kia:[ 
      { 
       model:'optima', 
       year:'2012' 
      } 
     ] 
    } 

    _.forOwn(cars, function(value, key) { 
    key.processed = true; 
    }).then(function(cars) { 
    //print modified cars object here 
    console.log(cars); 
    }); 

有人能幫忙嗎?

在此先感謝!

+3

'_.forOwn'是同步 - 擺脫'.then(功能(汽車){'和最後的'});' - 等voilà - 沒有承諾需要 –

+0

以前的評論者說,嘗試從簡單的迭代返回承諾沒有任何好處,它不是異步的 - 它的運行速度與javascript引擎可以執行的速度一樣快。但是,如果你所說的是,迭代需要啓動一系列異步的進程,那麼這與你實際詢問的那個完全不同。在這種情況下,你可以做一些'map'來返回promise數組(每個元素都有一個),然後在每次promise後返回,檢查它是否是最後一個,並且發出'done'的承諾。 – ErikE

+0

所以要確認 - '_.forOwn'總是會在'console.log(cars)'之前完成。 @ErikE在對象上做「地圖」工作嗎?我以爲'map'只適用於陣列... –

回答

1

一般來說,你可以做這樣的事情(注:沒有lodash,因爲我不使用lodash,但表現出來的概念應該適應lodash)

function someAsyncFunction(car) { 
    return new Promise(function(resolve) { 
     setTimeout(function() { 
      car.processed = true; 
      resolve(car); 
     }, 1000 * Math.random() + 1000); 
    }); 
} 

Promise.all(Object.keys(cars).map(function(key) { 
    return someAsyncFunction(cars[key]); 
})).then(function(results) { // results will be an array of the values resolved in the promises 
    console.log(cars); 
});