2017-02-06 5 views
1

シナリオは以下の通りです:チェーンjqueryの約束が、取り扱いの失敗は別途

  • コールは すべてがうまくている場合はオブジェクトの配列を返すサーバーに行われます。
  • サーバーでエラーが発生した場合は、エラーメッセージを含む jsonを返します。

    initData() 
        .done(function(myArray) { 
         processData(myArray); 
        }) 
        .fail(function(response) { 
         console.log("An error occured: " + response.errorMessage); 
        }); 
    

    クライアントがinitDataは()を行うことを気にしないでください。

は、このシナリオのうち、私はクライアントからこのように使用することができます約束を、返す関数を作成したいですサーバーにコールすると、ajax呼び出しの失敗またはサーバー固有のエラーの両方に対して呼び出されるfail()が取得されます。私は二つのこと必要とする。このために

  1. は、サーバーの呼び出しの失敗を隠すと、新しいエラーメッセージオブジェクトを作成します。
  2. サーバーへの呼び出しがエラーメッセージオブジェクトとともに返された場合、約束が失敗するようにします。

は、ここで私が持っているものです。

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を使用しています。

ありがとうございました。

答えて

1

thenコールバックからエラーを投げるだけです。呼び出し元はフェイルコールバックでコールをキャッチします(標準thencatchを使い、jquery固有のdonefailの使用を止めることをお勧めします)。それをINGの代わりにreturnの約束、単にthrow結果を失敗する

function initData() { 
    var promise = $.getJSON(url); 

    return promise.then(function(response) { 
     if (typeof response !== 'undefined' && response !== null && typeof response.errorMessage !== 'undefined') { 
      throw new Error("uh oh!"); 
     } 
     return response; 
    }, function(resp) { 
     // This satisfies point 1 above. 
     throw new Error("server error"); 
    }); 
} 
+0

感謝。お勧めの代替案を少し詳しく教えてください。 – Paul

+1

'done'と' fail'の使用をやめてください - jQuery固有のもので、jQueryがPromise仕様に一致するように実装を更新する前に。代わりに、仕様準拠の関数である 'then'と' catch'を呼び出してください。彼らはほとんど同じように動作するので、あなたの "クライアントコード"を '.done(...)fail(...)'から '.then(...)。catch(...)'に変更することができます。 – Brandon

+0

質問を投稿する前に遅延オブジェクトを使用して解決策を見つけたので私は主張していましたが、すでに質問が書かれていて、代替案が不思議でした。私はすでに友人の提案に従ってスローを使用しようとしましたが、これをサポートしていないjquery 1.11.3を最初から使用していたので、私の絶望にはうまくいかなかったのです。 答えについては、 'return {errorMessage:" Server error " };は、/ catchを使用しているときに期待どおりに動作しません。その場合、「スロー」は必須であると私は信じている。 – Paul

1

function initData() { 
    return $.getJSON(url)e.then(function(response) { 
     if (typeof response !== 'undefined' && response !== null && typeof response.errorMessage !== 'undefined') { 
      throw { errorMessage: "Response error." }; 
     } 
     return response; 
    }, function(resp) { 
     throw { errorMessage: "Server error." }; 
    }); 
} 

(これは、以前のバージョンのjQueryの3のようにのみ機能、Throwing an Error in jQuery's Deferred objectを参照してください)

関連する問題