2015-06-20 66 views
2

我在使用帆时遇到了多重问题,因为我无法理解水线承诺及其逻辑。我应该如何处理水线和蓝鸟的承诺和回调?

我试过两个内置蓝鸟承诺,甚至还有一个async.waterfall实现,并不能成功。

简而言之,我正在为执行数据库查询的API编写代码,并且通过试图使用回调函数,它从不响应。

这是我尝试过纯的承诺:

changeFormation: function (request,response) { 

    console.log("changeFormation"); 
    var lineupId = request.params.id; 
    var newFormation = request.param('formation'); 
    var newLineUp = request.param('lineup'); 
    console.log("Receiving" + newFormation); 

    if (["5-4-1", "5-3-2", "4-5-1", "4-4-2", "4-3-3", "3-5-2", "3-4-3"].indexOf(newFormation) === -1) { 
    console.log("No válida"); 
    return response.send(409, "La táctica elegida no es válida"); 
    } 

    LineUp.findOne({id: lineupId}). 
    then(function (foundLineUp) { 

    console.log(foundLineUp); 
    if (!foundLineUp) 
     return response.send(404); 

    if (! foundLineUp.formation) { 

     foundLineUp.formation = newFormation; 

    LineUp.update({id: foundLineUp.id}, foundLineUp).exec(function (err, saved) { 

     if (err) 
     return response.send(500, JSON.stringify(err)); 

     return response.send(202, JSON.stringify(saved)); 
    }); 

    } 

    // If a formation was previously set 
    else if (Array.isArray(newLineUp) && newLineUp.length > 0) { 

     newLineUp.formation = newFormation; 

     LineUp.update({id: newLineUp.id}, newLineUp).exec(function (err,saved) { 
     if (err) 
      return response.send(500,JSON.stringify(err)); 
     return response.stringify(202, JSON.stringify(saved)); 
     }); 
    } 
    console.log("Never reached"); 
    }). 
    catch(function (err) { 
    console.log(err); 
    response.send(500,JSON.stringify(err)); 
    }); 
}, 

在这上面,我可以在控制台"Never reached"看到。为什么!?

而这正是我试图使用异步模块:

addPlayer: function (request,response) { 

    // console.log("Add player"); 
    var lineupId = request.params.id; 

    var receivedPlayer = request.param('player'); 
    var playerId = receivedPlayer.id; 
    var bench = receivedPlayer.bench; 
    var place = receivedPlayer.place; 
    var e, r; 

    async.waterfall([ 

    function (cb) { 

     LineUp.findOne().where({id: lineupId}).exec(function (err, foundLineUp) { 
     cb(err,foundLineUp); 
     });}, 

    function (lineup,cb) { 

     Player.findOne().where({id: playerId}).exec(function (err,foundPlayer) { 
     cb(err,lineup, foundPlayer); 
     });}, 

    function (lineup, player, cb) { 
     if (!player) { 
     console.log("Jugador no existe"); 
     cb(null, {status: 409, msg: "El jugador " + playerId + " no existe"}); 
     } 

     if (!lineup.formation) { 
     console.log("No hay táctica") 
     cb(null, {status: 409, msg: "No se ha elegido una táctica para esta alineación"}); 
     } 

     if (lineup.squadIsComplete()) { 
     console.log("Ya hay 15"); 
     cb(null, {status: 409, msg: "La plantilla ya contiene el máximo de 15 jugadores"}); 
     } 

     if (lineup.playerWasAdded(player.id)) { 
     console.log("Jugador ya en alineación") 
     cb(null, {status: 409, msg: "El jugador ya ha sido agregado a la alineación"}); 
     } 

     if (lineup.fieldIsComplete() && !bench) { 
     console.log("Ya hay 11 en el campo"); 
     cb(null, {status: 409, msg: "Ya se han agregado los 11 jugadores de campo"}); 
     } 

     player.bench = bench; 
     player.place = place; 

     lineup.players.push(player); 

     console.log("MaxForeign " + lineup.reachesMaxForeignPlayers()); 
     console.log("BudgetLimit " + lineup.reachesBudgetLimit()); 
     console.log("SameTeam " + lineup.reachesMaxSameTeamLimit()); 
     console.log("reachesMaxSameFavoriteTeamLimit " + lineup.reachesMaxSameFavoriteTeamLimit()); 


     // If any of rule restrictions evaluates to true ... 
     // Using lodash _.some with out second argument which defaults to _.identity 
/*  if (_.some([ lineup.reachesMaxForeignPlayers(), 
        lineup.reachesBudgetLimit(), 
        lineup.reachesMaxSameTeamLimit(), 
        lineup.reachesMaxSameFavoriteTeamLimit()])) { 

     return response.send(409, "La inclusión de este jugador no satisface las reglas del juego"); 
     }*/ 

     LineUp.update({id: playerId}, lineup).exec(function (err, saved) { 
     cb(err, {status: 202, msg: JSON.stringify(saved)}); 
     }); 
    } 
    ], 

    function (err, result) { 
    console.log("About to respond"); 
    if (err) 
     respond.send(500); 
    else 
     response.send(result.status, result.msg); 
    }); 

    console.log("Never reached"); 
}, 

这给不超时,但它并不奇怪,当它应该更新文档。它的日志记录"never reached"然后"about to respond"但这是正常的,我猜。

到目前为止,我该如何处理这一切?

+1

为什么你会期待'console.log(“永远不会到达”);'永远不会到达?没有达到的唯一情况就是发送404。 – Bergi

+2

嗯,这两个代码片段似乎完全不相关,并使用不同的方法。请只询问每个问题的单个问题(尽管您可能包含多种不同的方法来解决问题) – Bergi

回答

2

在上面我可以看到在控制台“从未到达”。为什么!?

因为您将异步代码与sync'd代码混合在一起。如果你这样做:

function(){ 
    console.log('init'); 
    someAsyncMethod(function callback(){ 
    return console.log('async done'); 
    }); 
    console.log('Never reached'); 
} 

您将获得:

init 
Never reached 
async done 

由于异步代码会被执行之后。我建议你阅读thisthis以更好地理解异步回调。

这不是超时,但奇怪的是它不应该更新文档。

很难说这是怎么回事,因为我们不知道的LineUp模型定义,我们不前和update电话后知道lineup内容。你确定LineUp.update()跑了吗?为什么不在回调中添加console.log()以查看结果?

到目前为止,我该如何处理这一切?

在我看来,你已经接近实现你的目标。如果您分享LineUp的模型定义和更多日志记录,我们将能够为您提供更多帮助。

+0

嘿,感谢您的回复,我确实在我的代码甚至是这篇文章中做出了愚蠢的假设。不过,我发现这个问题,导致我完全混淆。我已经发布了一个单独的问题,如果你有Sails的经验,我希望你能检查出来:http://stackoverflow.com/questions/30958122 – diegoaguilar