2017-05-04 19 views
1

この場合、プロミスチェーンをどのように停止する必要がありますか? 最初の条件がtrueの場合にのみ、2番目のコードを実行します。最初のタスクの他にある(「拒否」)拒否 :プロミスチェーンを解除するにはどうすればよいですか?

var p = new Promise((resolve, reject) => { 
    setTimeout(function() { 
     resolve(1) 
    }, 0); 
}); 

p 
.then((res) => { 
    if(true) { 
     return res + 2 
    } else { 
     // do something and break the chain here ??? 
    } 
}) 
.then((res) => { 
    // executed only when the condition is true 
    console.log(res) 
}) 
+3

ここでエラーを投げるのは、あなたのユースケースでうまくいくでしょうか? – jas7457

+0

はい、私は知っていますが、それは約束を破ってしまい、その次にヒットしないでしょう。 。それが彼がしようとしていることばかりであれば、これはうまくいくでしょう。 – jas7457

答えて

4

あなたが約束鎖の末端にcatch、その後、elseブロックでそれをErrorthrowことができます。

var p = new Promise((resolve, reject) => { 
    setTimeout(function() { 
     resolve(1) 
    }, 0); 
}); 

p 
.then((res) => { 
    if(false) { 
     return res + 2 
    } else { 
     // do something and break the chain here ??? 
     throw new Error('error'); 
    } 
}) 
.then((res) => { 
    // executed only when the condition is true 
    console.log(res) 
}) 
.catch(error => { 
    console.log(error.message); 
}) 

デモ - https://jsbin.com/ludoxifobe/edit?js,console

+0

これを停止する方法はありますか? elseブロックのコードが 'エラー'ではないので、 – vincentf

+1

@vincentf yes、 'return Promise.reject( 'some messeage or not'); in else。 –

-6

だけのようなものを使用。

P 
.then((res) => { 
    if(true) { 
     return res + 2 
    } else { 
     reject('rejected due to logic failure' } 
}) 
.then((res) => { 
    // executed only when the condition is true 
    console.log(res) 
}) 

またuはまた)(.catchで最初のタスクをウルし、これが役立ちます 希望をキャッチセクションを追加することができます。

+4

'reject'はここでは定義されません。新しいPromiseコンテキストでのみ利用可能です。これは動作しません。スコープは非常に不確かなようです。 – jas7457

+3

それが定義されているだけでなく、解決策が間違っています。そのうちの1つが呼び出された後に 'resolve'または' reject'(同じ約束)の追加呼び出しは無視されます。 – traktor53

0

あなたは

を言う the documentationを読むことができます

Promise.then戻り値入力関数がエラーをスローした場合、または入力関数は拒否されたPromiseを返します。

ご希望の場合は、およそthenpromise2は結果の約束を指しセクションで、Promise A specを読むことができる:onFulfilledonRejectedのいずれかが例外eをスローする場合

promise2は拒否しなければなりません理由はeです)

好きな方は、2ality blog

then()(受信機のコンストラクタで作成した)新しい約束のQを返します。 反応のいずれかが値を返す場合、Qはそれで解決されます。 いずれかの反応が例外をスローした場合、Qはその反応で拒否されます。

あなたは輝かしいYDKJSを読むことができる:

、その後(..)呼び出しの履行または拒否ハンドラのいずれかの内部スローされた例外は、すぐにそれと拒否される次の(連鎖)約束を引き起こし例外。

関連する問題