2017-01-18 23 views
1

次の例では、条件付きでsomePromiseを実行し、条件に関係なくanotherPromiseを実行します。約束をifと組み合わせる方法は?

if (somecondition) { 
    somePromise().then((args) => { ... }); 
} 

// Not waiting for somePromise() here, but it should. 
return anotherPromise().then((args) => { 
    muchmorecodehere; 
} 

私は今考えることができる唯一の方法は、関数に最後の部分を回すと、両方のブランチにそれを実行することですが、それは非常に面倒なようです。確かに私は何か間違っている?

let helperFunction =() => { 
    return anotherPromise().then((args) => { 
     muchmorecodehere; 
    } 
} 

if (somecondition) { 
    return somePromise().then((args) => { ... }).then(helperFunction); 
} 

return helperFunction; 
+1

'somePromise'が実行された場合、' anotherPromise'が起動する前に 'anotherPromise'が終了するのを待ちますか?それとも、両方を走らせたいのですか? –

+0

チェーンを使い、何らかの条件で拒否して、最初に2番目の実行を避けるのはなぜですか? – VadimB

+0

はい、 'anotherPromise'は' somePromise'が最初に終了するのを待つべきです。ありがとう。 – cib

答えて

2

あなたは.then()が新たな約束とチェーンオフのどちらかというダミーの約束を返すという事実を利用することができます。

var nextPromise = somecondition 
    ? somePromise.then((args) => { ... }) 
    : Promise.resolve(); 

return nextPromise.then(() => anotherPromise) 
    .then((args) => { 
     // muchmorecodehere 
    }); 
+0

あなたの解決策を正しく理解していれば、条件に関係なく 'somePromise'が実行されます。条件が真である場合にのみ 'somePromise'を実行したいと思います。たぶん、 ':somePromise'、':Promise.resolve() '、またはそれらの行に沿ったものの代わりに? – cib

+1

@cib 3行目の 'somePromise'を' Promise.resolve() 'に置き換えることができます。私は自分の投稿を編集しましたが、約束がどのように働くか混乱するかもしれません。彼らはあなたが '.then()'を呼び出すまで、通常は実行を待つことはありません。それらは通常、作成するとすぐに実行を開始します。 'then()'は、利用可能なときに結果を得る方法を提供するだけです。 – JLRishe

+0

Fair point、私はおそらく、 'somePromise'を' createSomePromise() 'と書いているはずです。 – cib

1

をあなたはデフォルトを作成することができ、すでに解決し、約束は(呼び出しをすることができますそれはconditionalPromiseです)、条件付き部分については、常にanotherPromiseとこの約束を連鎖してください。

someConditionfalseの場合、conditionalPromiseは既に解決済みの約束であり、anotherPromiseに安全にチェーンすることができます。

someCondition場合trueが、その後somePromiseconditionalPromiseに割り当てられ、それが解決されるとき、そのanotherPromiseが実行されますです。

conditionalPromise = Promise.resolve(); // Create a default, already resolved, promise 
if (someCondition) { 
    // Assign somePromise to conditionalPromise, overwriting the default one 
    conditionalPromise = somePromise 
} 

// Now chain the 2 promises 
return conditionalPromise.then((args) => { 
    anotherPromise.then((args) => { 
     muchmorecodehere; 
    } 
}); 
0

問題を回避する別の方法は、単にPromise.resolve()にそれを連結することthenブロックで初期ifをラップすることです。

return Promise.resolve().then(() => { 
    if (somecondition) { 
     return somePromise().then((args) => { ... }); 
    } 
}).then(() => { 
    return anotherPromise(); 
}).then((args) => { 
    //muchmorecodehere 
});