1. ホーム
  2. node.js

[解決済み] プロミスで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つ質問があります。

  1. プロミスで新しいプロミス→処理を始めるのはどうなんだろうということです。

  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
});