新しいゲームを作成するためにサーバー上で投稿リクエストを受け取ると、私は2つのクエリを実行します。まず、ユーザーが既にゲームに参加しているかどうかを検索し、そうであればゲームを返します。さもなければ、誰かが相手を待っているオープンなゲームを探してそのゲームを返します。最後に、上記の状態のゲームが見つからない場合は、新しいゲームを作成して返します。だから私のコードは次のようなものになります。ExpressJS/NodeJS/Promises:約束のチェーンから早めに返信
.post(function(req, res, next){
...findUsersExistingGame...
.then(function(game){
if(game){ return res.send(game); }
else{
return ...findUserWaitingForOpponentsGame...
}
}
.then(function(game){
if(game){ return res.send(game); }
else{
return ...createNewGame...
}
})
.then(function(game){
return res.send(game);
})
.catch(function(err){
return next(err);
});
を私は最終的には読みやすくするためのヘルパー関数に各機能をリファクタリングしますが、私は最初のチェーンを把握する必要があります。私の質問は、私が約束のチェーンの早い段階でゲームを見つけた場合(つまり、ユーザーの既存のゲームか、相手を待っている別のユーザーがいる場合)、私はres.send(ゲーム)を返します。しかし、私の前の.then()ステートメントが未定義を返したため、3番目の。私がres.send(ゲーム)をしたい場合、私は約束のチェーンから早めに戻っていかなければなりませんか?
オプション1:私はエラーをスローして明示的にキャッチする提案を見たことがありますが、それはエラーを使用してフローを制御することは根本的に間違っています。
オプション2:代わりに約束をチェーンで、私はこのような何かを行うことができますが、これは「約束/コールバック地獄」に似:私はまだしようとしているので、
.post(function(req, res, next){
...findUsersExistingGame...
.then(function(game){
if(game){ return res.send(game); }
else{
...findUserWaitingForOpponentsGame...
.then(function(game){
if(game){ return res.send(game); }
else{
return ...createNewGame...
.then(function(game){
return res.send(game);
});
}
})
}
}
(好ましくはES5であり、別の方法であります基本的に約束を理解することができますが、ES6も歓迎です)ここ
ES7の提案されているasync/await構文(https://github.com/yortus/asyncawait#1-introduction)を探しているような感じです。あなたが今それをしたい場合は、おそらくそれのためのtranspilerを見つけることができます... –
コールバック地獄/投げているエラーは私の唯一のオプションですか? – PDN
@PDN「yield」と(ES6)はどうですか?または 'イベント駆動アーキテクチャ'? –