嵌套.then()的承诺

时间:2017-05-11 09:33:56

标签: javascript node.js web promise

我在简化我编写的代码的可读性方面遇到了一些困难,到目前为止,我已经设法将代码分成两个主要函数,但是我仍然遇到嵌套.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
}

2 个答案:

答案 0 :(得分:2)

如果您正在编写nodejs 7,则可以从--harmony-async-await标志开始。

这允许新的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;
  }

答案 1 :(得分:0)

对我而言,then()在_each中是有点奇怪。如果我从你的评论中理解,如果horsePostHandler.init(raceEntity,race.Horse)返回Promise.all(promises数组),我会像这样重写它。

    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
    }

读更多像"首先是init()然后用每个值"做一些事情。