2016-05-10 5 views
0

最近、jQuery AJAXの呼び出しと約束に関連するコードの微妙なバグがありました。これを行う理由は、今重要でない、そしてもちろん、他の部品の多くは、問題にreleventされていない上に記載されていない約束チェーンがあった拒否されたjQuery AJAX呼び出しから返される '理由'が返されるのはなぜですか?

Promise 
    .resolve($.ajax(...)) 
    .catch(function(err){return err}) 
    .then(function(response){//do something with response} 

:一言で言えばどのようなコードがやっていたことと同等でした。私がしたいのは、AJAXコールからの拒否理由が解決されたパスに終わることでしたが、毎回再拒否されました。

最終的に、拒否されたjQuery AJAX呼び出しから返される応答には、それ自体の理由で拒否するthenメソッドがあることがわかりました。明確にする:

Promise.resolve($.ajax(...)) //an ajax call which will reject 
    .catch(function(err){ 
     err.then(null,function(err2){ 
      if (err===err2) console.log("AJAX error rejects with itself as a reason!"); 
     }); 
    }); 

コンソールに表示されるメッセージを記録します。

私の質問は、なぜこれが行われたのですか?それが拒否された約束が返還される理由がありますか?さらに、この可用性が理由としてそれ自体を拒絶すべきであるという正当な理由があるか?


は混乱を避けるため、下記の2番目のコードブロックであり、第一のブロックと返されたエラーを格納するための外部変数と同じ連鎖スタイルを使用するように書き換えます。

var reason; 
Promise 
    .resolve($.ajax(...)) 
    .catch(function(err){ 
     reason=err; 
     return err 
    }) 
    .then(function(response){//will not be called if the ajax rejects} 
    .catch(function(err){ 
     if (err===reason) console.log("AJAX error rejects with itself as a reason!"); 
    }) 

答えて

0

あなたは約束が間違っています。約束の返事は解決され、itsefで拒否されます。

あなたが行うときに、この

Promise.resolve($.ajax(...)) //an ajax call which will reject 
.catch(function(err){ 
    err.catch(function(err2){ 
     if (err===err2) console.log("AJAX error rejects with itself as a reason!"); 
    }); 
}); 

あなたはjqueryのAJAX呼び出しのいずれかの結果を解決し、それが常に正常に動作します、あなたはすべての

+0

まず、私は上記の2番目のコードブロックにミスをしたNRおよび'.catch(...)'ではなく '.then(null、...)'を使っていたはずです。 2番目はcatch関数内で返されたオブジェクトを解決していますので、 'err'オブジェクトはネストされたcatchブロック内で引き続き使用できるので、それらを比較できます。もちろん、私はエラー値を返すことができ、それを約束として解決してから拒否することができますが、それを外部クロージャーに格納しない限り、 'err'は利用できません。 –

関連する問題