我在简化我编写的代码的可读性方面遇到了一些困难,到目前为止,我已经设法将代码分成两个主要函数,但是我仍然遇到嵌套.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 :(得分: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()然后用每个值"做一些事情。