2017-02-02 7 views
6

私はnodejsプロジェクトで作業しており、チェーン内で約束を飛ばしたいと思っています。以下は私のコードです。最初の約束ブロックでは、値{success: true}が解決されます。 2番目のブロックでは、successの値をチェックしたいと思います。もし本当であれば、その値を呼び出し側に返し、残りの約束をスキップします。値がfalseの場合はチェーンを続行します。私はエラーをスローするか、2番目のブロックで拒否できることは知っていますが、エラーケースではないエラーケースを処理する必要があります。だから、私はこれをどのようにして有望なチェーンで達成できるでしょうか?他のサードパーティのライブラリを持たずに解決策が必要です。単に巣あなたはスキップするチェーン(あなたのケースでは余り)の一部チェーン内で約束をスキップする方法

new Promise((resolve, reject)=>{ 
    resolve({success:true}); 
}).then((value)=>{ 
    console.log('second block:', value); 
    if(value.success){ 
     //skip the rest of promise in this chain and return the value to caller 
     return value; 
    }else{ 
     //do something else and continue next promise 
    } 
}).then((value)=>{ 
    console.log('3rd block:', value); 
}); 
+0

あなたはチェーンの真ん中からリンクを外して1つのチェーンを持っているとは思えません...あなたは2つあります!もちろん、チェーンに沿って「特別に細工された」値を送信して検出することもできます。 –

+0

呼び出し元に値を返すことはできません。 promiseを呼び出した結果は、返された値ではなく、promiseオブジェクトを返します。 – modernator

+0

[可能性のある場合には、if-elseをどのように扱うか?](http://stackoverflow.com/questions/33257412/how-to-handle-the-if​​-else-in-promise-then) –

答えて

4

new Promise(resolve => resolve({success:true})) 
.then(value => { 
    console.log('second block:', value); 
    if (value.success) { 
     //skip the rest of this chain and return the value to caller 
     return value; 
    } 
    //do something else and continue 
    return somethingElse().then(value => { 
     console.log('3rd block:', value); 
     return value; 
    }); 
}).then(value => { 
    //The caller's chain would continue here whether 3rd block is skipped or not 
    console.log('final block:', value); 
    return value; 
}); 
+0

チェーン内の私の約束の残りは非常に長いです。私がそうするなら、私は好きではないネストされた約束を作る必要があります。それを行う良い方法はありますか? –

+1

@ ZhaoYiここに入れ子には何も問題ありません。 'if'の中に文を入れ子にしますか?それはイディオム的に正しいIMHOである約束の条件分岐です。 [同様の質問への私の答え](http://stackoverflow.com/a/40413396/918910)を参照してください。 – jib

+1

@ZhaoYi - 条件付きで実行される '.then()'ハンドラは、メインチェーンの短いサブブランチを作成するため、ネストする必要があります。あなたのチェーンの残りの部分は一番上のレベルで続けることができます(この回答では表示されません)。分岐には入れ子が必要です。 – jfriend00

2

あなたは、ネストのアイデアを気に入らない場合、あなたはの残りを考慮することができます別の関数へのごチェーン:それはさておき

// give this a more meaningful name 
function theRestOfThePromiseChain(inputValue) { 
    //do something else and continue next promise 
    console.log('3rd block:', value); 

    return nextStepIntheProcess() 
     .then(() => { ... }); 
} 

function originalFunctionThatContainsThePromise() { 
    return Promise.resolve({success:true}) 
     .then((value)=>{ 
      console.log('second block:', value); 
      if(value.success){ 
       //skip the rest of promise in this chain and return the value to caller 
       return value; 
      } 

      return theRestOfThePromiseChain(value); 
     }); 
} 

は、約束ミッドストリームを停止する方法は本当にありません。

+1

別個の機能がまだ技術的に入れ子になっています。 – jib

+1

@jib実行の観点からは多分ですが、コードがフォーマットされている限り(私はOPが心配していると思います)、過度のネストやコードの長い伸びを避けることができます。彼らは始まりと終わりです。 – JLRishe

関連する問題