シナリオは以下の通りです:チェーンjqueryの約束が、取り扱いの失敗は別途
- コールは すべてがうまくている場合はオブジェクトの配列を返すサーバーに行われます。
- サーバーでエラーが発生した場合は、エラーメッセージを含む jsonを返します。
initData() .done(function(myArray) { processData(myArray); }) .fail(function(response) { console.log("An error occured: " + response.errorMessage); });
クライアントがinitDataは()を行うことを気にしないでください。
は、このシナリオのうち、私はクライアントからこのように使用することができます約束を、返す関数を作成したいですサーバーにコールすると、ajax呼び出しの失敗またはサーバー固有のエラーの両方に対して呼び出されるfail()が取得されます。私は二つのこと必要とする。このために
:
- は、サーバーの呼び出しの失敗を隠すと、新しいエラーメッセージオブジェクトを作成します。
- サーバーへの呼び出しがエラーメッセージオブジェクトとともに返された場合、約束が失敗するようにします。
は、ここで私が持っているものです。
function initData() {
var promise = $.getJSON(url);
return promise.then(function(response) {
if (typeof response !== 'undefined' && response !== null && typeof response.errorMessage !== 'undefined') {
// Do something to trigger fail() in the client caller.
}
return response;
}, function(resp) {
// This satisfies point 1 above.
return { errorMessage: "Server error." };
});
}
私は2番目の要件を満たすことがどのように?私はjquery 3.1.1を使用しています。
ありがとうございました。
感謝。お勧めの代替案を少し詳しく教えてください。 – Paul
'done'と' fail'の使用をやめてください - jQuery固有のもので、jQueryがPromise仕様に一致するように実装を更新する前に。代わりに、仕様準拠の関数である 'then'と' catch'を呼び出してください。彼らはほとんど同じように動作するので、あなたの "クライアントコード"を '.done(...)fail(...)'から '.then(...)。catch(...)'に変更することができます。 – Brandon
質問を投稿する前に遅延オブジェクトを使用して解決策を見つけたので私は主張していましたが、すでに質問が書かれていて、代替案が不思議でした。私はすでに友人の提案に従ってスローを使用しようとしましたが、これをサポートしていないjquery 1.11.3を最初から使用していたので、私の絶望にはうまくいかなかったのです。 答えについては、 'return {errorMessage:" Server error " };は、/ catchを使用しているときに期待どおりに動作しません。その場合、「スロー」は必須であると私は信じている。 – Paul