2017-05-11 118 views
0

我在簡化我寫的代碼的可讀性方面有一些困難,到目前爲止我已經設法將代碼分離成兩個主要功能,但是我仍然遇到了嵌套的。然後()。我不確定是否有更簡單的方法來編寫這兩個函數。任何有關結構和指針的正確方向的建議都會得到真正的讚賞。嵌套.then()的承諾

我還應該強調,horsePostHandler.init()函數指的是一個不同的模塊。此示例中顯示的函數init()是racePostHandler的一部分。

RacePostHandler.js

function createHorseEntities(raceEntity) { 
    promises = horsePostHandler.init(raceEntity, race.Horse) 
    _.each(promises, function(promise){ 
     promise.then(function(entity){ 
      if (raceEntity.horses.length === 0) { 
       controller.update({ "horseUpdate": true, "horseEntity": entity }, raceEntity) 
      } 
     }) 
    }) 
    return raceEntity 
} 
function init(object) { 
    handler.data = object.data.PARaceCardObject ? object.data.PARaceCardObject : object.data.PABettingObject; 
    racePromises = _.map(handler.data.Meeting.Race, function(race) { 
     return Promise.all([ getMeeting(object.promise), controller.find({ x_reference: race.ID }) ]) 
     .spread(function(meetingEntity, raceEntity) { 
      return doesRaceExist(meetingEntity, raceEntity, race) 
     }) 
     .then(createHorseEntities) 
     .catch(errorHandler) 
    }) 
    return racePromises 
} 

HorsePostHandler.js

的主要原因予分離的RacePostHandler和HorsePostHandler成單獨的模塊使用不同的控制器是由於它們。一個與Race模型交互,另一個與Horse模型交互。

function init(raceEntity, horseArray) { 
    promises = _.map(horseArray, function(horse) { 
     return controller.find({name: horse.Name}) 
     .then(function(horseEntity){ 
      return doesHorseExist(raceEntity, horseEntity, horse) 
     }) 
    }) 
    return promises 
} 
+0

您不能在承諾中使用'_.each'。 – Bergi

+0

我目前的代碼完全符合_.each。但是,我只是在做一些家務活,並且正在爲重組而苦苦掙扎。 horsePostHandler返回我需要迭代的滿足承諾數組。如果您有任何其他替代方案可以從履行承諾中獲得價值,請隨時解釋。 – CBainbridge

+0

'each'的問題是'createHorseEntities'不會返回一個允許等待控制器完成所有更新的許諾。就像你在'init'中做的那樣,最好應用'map'並使用'Promise.all'。 – Bergi

回答

2

如果你正在編寫nodejs 7,你可以用--harmony-async-await標誌開始。

這使得新的異步/等待功能,這是更可讀:

async function run() { 
    try { 
     let result1 = await myFirstPromise 
     let moreResults = await Promise.all([mySecondPromise, myThirdPromise) 
     let finalResult = await lastPromise 
     finalResult = doSomethingWith(finalResult) 
     return finalResult  
    } catch(err) { 
     console.warn(err) 
    } 
} 

run() 

在使用最新的JavaScript(ES7我覺得)你的例子是:

async function createHorseEntities(raceEntity) { 
     for (let entity of (await horsePostHandler.init(raceEntity, race.Horse))) { 
      if (raceEntity.horses.length === 0) { 
       controller.update({ "horseUpdate": true, "horseEntity": entity} , raceEntity) 
      } 
     } 
     return raceEntity; 
    } 
+0

謝謝你指點我在正確的方向。 – CBainbridge

+0

保羅你真的不必爲我重寫我的代碼,我打算自己玩弄它。再次感謝您的幫助。 – CBainbridge

0

對我來說,有點奇怪的是then()在_each裏面。如果horsePostHandler.init(raceEntity,race.Horse)根據我的理解返回Promise.all(promise的數組),我會像這樣重寫它。

function createHorseEntities(raceEntity) { 
     horsePostHandler.init(raceEntity, race.Horse) 
     .then(function(entities) { 
      _.each(entities, function(entity){ 
       if (raceEntity.horses.length === 0) { 
        controller.update({ "horseUpdate": true, "horseEntity": entity} , raceEntity) 
       } 
      }) 
     }) 
     return raceEntity 
    } 

閱讀更多內容,如「first init()然後對每個值做一些事情」。