[解決済み] プロミスでif-elseを処理するには?
2023-01-18 16:07:03
質問
プロミスオブジェクトから返り値を取得する際に、2つの異なる
then()
のような、値の条件によって異なる処理を開始する必要があります。
promise().then(function(value){
if(//true) {
// do something
} else {
// do something
}
})
みたいな感じで書けばいいのかなと思っています。
promise().then(function(value){
if(//true) {
// call a new function which will return a new promise object
ifTruePromise().then();
} else {
ifFalsePromise().then();
}
})
とありますが、これで2つ質問があります。
-
プロミスで新しいプロミス→処理を始めるのはどうなんだろうということです。
-
もし、2つのプロセスが最後の1つの関数を呼び出すために必要であればどうでしょうか?それは、同じターミナルを持っていることを意味します。
というように、元のチェーンを維持したまま新しい約束を返してみました。
promise().then(function(value){
if(//true) {
// call a new function which will return a new promise object
// and return it
return ifTruePromise();
} else {
// do something, no new promise
// hope to stop the then chain
}
}).then(// I can handle the result of ifTruePromise here now);
が、この場合、真であろうと偽であろうと、次の
then
は動作します。
では、どのように処理するのがベストプラクティスなのでしょうか?
どのように解決するのですか?
関数がプロミスを返す限り、あなたが提案した最初の方法を使用することができます。
以下のフィドルは、最初に解決される値が何であるかに応じて、どのように異なる連鎖経路を取ることができるかを示しています。
function myPromiseFunction() {
//Change the resolved value to take a different path
return Promise.resolve(true);
}
function conditionalChaining(value) {
if (value) {
//do something
return doSomething().then(doSomethingMore).then(doEvenSomethingMore);
} else {
//do something else
return doSomeOtherThing().then(doSomethingMore).then(doEvenSomethingMore);
}
}
function doSomething() {
console.log("Inside doSomething function");
return Promise.resolve("This message comes from doSomeThing function");
}
function doSomeOtherThing() {
console.log("Inside doSomeOtherthing function");
return Promise.resolve("This message comes from doSomeOtherThing function");
}
function doSomethingMore(message) {
console.log(message);
return Promise.resolve("Leaving doSomethingMore");
}
function doEvenSomethingMore(message) {
console.log("Inside doEvenSomethingMore function");
return Promise.resolve();
}
myPromiseFunction().then(conditionalChaining).then(function () {
console.log("All done!");
}).
catch (function (e) {
});
また、条件付きチェインを1つだけ作り、戻り値の約束を変数に代入し、どちらか一方を実行すべき関数を実行し続けることも可能です。
function conditionalChaining(value){
if (value) {
//do something
return doSomething();
} else{
//do something else
return doSomeOtherThing();
}
}
var promise = myPromiseFunction().then(conditionalChaining);
promise.then(function(value){
//keep executing functions that should be called either way
});
関連
-
[解決済み】passport.js passport.initialize() ミドルウェアが使用されていません。
-
[解決済み] ExpressJS : res.redirect()が期待通りに動作しない?
-
[解決済み] package.jsonのチルダ(~)とキャレット(^)の違いは何ですか?
-
[解決済み] npm installの-saveオプションは何ですか?
-
[解決済み] インストールされているnpmパッケージのバージョンを検索する
-
[解決済み] package.jsonの各依存関係を最新バージョンに更新する方法は?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Reduxの非同期フローになぜミドルウェアが必要なのか?
-
[解決済み】プロミスの値にアクセスする方法は?
-
[解決済み] .then()チェーンで以前のプロミス結果にアクセスするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Discord.js が特定のチャンネルにメッセージを送信する場合
-
[解決済み] 再インストールを繰り返しても、npm run でモジュール 'sass' が見つからない。
-
[解決済み】 console.logの出力をどこに永久保存するか?
-
[解決済み】Express.js req.bodyが未定義です。
-
[解決済み】passport.js passport.initialize() ミドルウェアが使用されていません。
-
[解決済み】Passport.js - エラー: ユーザーのセッションへのシリアライズに失敗しました。
-
[解決済み] ブラウザで動作しているURLで「connect ETIMEDOUT」エラーが発生する原因は何ですか?
-
[解決済み] のエラーが発生しました。これはおそらくnpmの問題ではありません。上に追加のログ出力があると思われます
-
[解決済み] S3 Bucket に何かを送信しようとすると、AWS Missing credentials が表示される (Node.js)
-
[解決済み] node.jsのセットアップウィザードが途中で終了してしまう