2012-10-17 11 views
6

このコードスニペットは成功/エラーコールバックと約束スタイルコールバックの両方で1.7.2で動作しました。 1.8.2では、成功/エラーコールバックは引き続き機能しますが、約束は効きません。私の感想は、return dfd.promise(jqXHR);行が問題だが確かではないということだ。私の約束はもはやjQuery 1.8で働いていません

$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 

    // Don't infinitely recurse 
    originalOptions._retry = isNaN(originalOptions._retry) 
     ? Common.auth.maxExpiredAuthorizationRetries 
     : originalOptions._retry - 1; 

    // set up to date authorization header with every request 
    jqXHR.setRequestHeader("Authorization", Common.auth.getAuthorizationHeader()); 

    // save the original error callback for later 
    if (originalOptions.error) 
     originalOptions._error = originalOptions.error; 

    // overwrite *current request* error callback 
    options.error = $.noop(); 

    // setup our own deferred object to also support promises that are only invoked 
    // once all of the retry attempts have been exhausted 
    var dfd = $.Deferred(); 
    jqXHR.done(dfd.resolve); 

    // if the request fails, do something else yet still resolve 
    jqXHR.fail(function() { 
     var args = Array.prototype.slice.call(arguments); 

     if (jqXHR.status === 401 && originalOptions._retry > 0) { 

      // refresh the oauth credentials for the next attempt(s) 
      // (will be stored and returned by Common.auth.getAuthorizationHeader()) 
      Common.auth.handleUnauthorized(); 

      // retry with our modified 
      $.ajax(originalOptions).then(dfd.resolve, dfd.reject); 

     } else { 
      // add our _error callback to our promise object 
      if (originalOptions._error) 
       dfd.fail(originalOptions._error); 
      dfd.rejectWith(jqXHR, args); 
     } 
    }); 

    // NOW override the jqXHR's promise functions with our deferred 
    return dfd.promise(jqXHR); 
}); 

更新

$.ajax({ 
     url: someFunctionToGetUrl(), 
     // works 
     //success: callback, 
     //error: ajaxErrorHandler 
    }).then(
     [callback], 
     [errorback, ajaxErrorHandler] 
    ); 
}; 
+0

リクエストは同期していますか?もしそうなら、 'jqXHR'では動作しません。 docsから: "jQuery 1.8では、jqXHR($ .Deferred)でasync:falseを使用することは推奨されていません。完全/成功/エラーコールバックを使用する必要があります。 – bfavaretto

+0

いいえ、私のAjaxリクエストを投稿に追加しました – ryan

+0

あなたはChromeデバッガーをよく知っていますか? >。< あなたの投稿には以下の人が答えられます:全く同じ事をしている(または研究している) 2は忍耐を持っており、調査するための例を設定します。だからあなたが答えを出すなら、助けになるだろう。 – EricG

答えて

7

編集:ここで失敗した私のAJAX要求があるこれはドキュメントのバグですが、動作は仕様です。 deferred.thendeferred.pipeのように振る舞い、配列の受け渡しができなくなりましたが、ドキュメントに反映されていないようにAPIが変更されました。

関連のバグ:

まだ適用の下に、私は私のオリジナルの答えの最後に説明し、回避策。


オリジナルの答え:

それは私にはjQueryのバグのように見えます。だけで結構です

http://jsfiddle.net/tunDH/

しかし、the documentationは関数の配列は言う:あなたが最初の引数としての単一機能のリファレンスを渡した場合、それが動作しますが、関数の配列を渡していない場合

doneCallbacks   Deferredが解決されたときに呼び出される関数または関数の配列。

そして、あなたは正しいです。これは、jQueryの1.7で動作します:あなたはおそらく必要があります

$.ajax({ 
    url: someFunctionToGetUrl(), 
    // works 
    //success: callback, 
    //error: ajaxErrorHandler 
}).then( 
    function(){ 
     callback1.apply(this, arguments); 
     callback2.apply(this, arguments); 
    }, 
    [errorback, ajaxErrorHandler] 
); 

http://jsfiddle.net/tunDH/2/

http://jsfiddle.net/tunDH/1/

回避策は代わりの配列内の、すべての機能を単一の関数内で呼び出しをラップすることですエラーコールバックで同じことをするのですが、私はそれをテストしませんでした。

関連する問題