2017-05-11 11 views
0

私が書いたコードの読みやすさを単純化するのにはいくつかの難しさがありますが、これまではコードを2つの主な機能に分けていましたが、 。()の。私はこれらの2つの関数を書く簡単な方法があるかどうかはわかりません。正しい方向の構造とポインタに関するアドバイスは本当に感謝しています。ネストされた.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を分離する主な理由は、異なるコントローラを使用してそれらのためでした。 1つはレースモデルと、もう1つはホースモデルと相互作用します。

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は、繰り返し処理するのに必要な、実現した約束事の配列を返します。 fufilledの約束の配列から値を取得する他の選択肢がある場合は、自由に説明してください。 – CBainbridge

+0

'each'の問題は、' createHorseEntities'が、コントローラがすべての更新を完了するまで待つことを約束するものを返さないということです。 'init'のように' map'を適用し、 'Promise.all'を使用します。 – Bergi

答えて

2

nodejs 7を作成している場合は、--harmony-async-awaitフラグで開始できます。

これは新しい非同期は/はるかに読みやすい機能を待つことができます:それはある

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

私のために:最新のJavaScript(ES7私は思う)を使用して、あなたの例では

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() 

になりthen()がそれぞれの中に入っているのがちょっと奇妙です。あなたのコメントから理解できるように、horsePostHandler.init(raceEntity、race.Horse)がPromise.all(約束事の配列)を返す場合、私はこのように書き直します。

「最初のinit()」のように、それぞれの値で何かを行います。

関連する問題