2012-10-17 15 views
6

Ten fragment kodu działał w wersji 1.7.2 zarówno z wezwaniami zwrotnymi/błędami, jak iz obietnicami zwrotów stylistycznych. W wersji 1.8.2 wywołania zwrotne/błędy nadal działają, ale obietnice nie. Mam przeczucie, że linia return dfd.promise(jqXHR); jest problemem, ale nie jestem pewna.Moje obietnice już nie działają w 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); 
}); 

Aktualizacja: Oto mój wniosek, że nie ajax:

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

Czy Twoje żądania są synchroniczne? Jeśli tak, to nie zadziała z 'jqXHR'. Z dokumentacji: "Od wersji jQuery 1.8 użycie async: false z jqXHR ($ .deferred) jest przestarzałe, należy użyć pełnych/powodzenia/błędów zwrotnych." – bfavaretto

+0

Nie, dodano moje żądanie ajax w poście – ryan

+0

Czy znasz już debugger Chrome? >. < Twój wpis może zostać wysłuchany przez osoby, które: 1 odbierają dokładnie to samo (lub prowadzą badania). 2 Miej cierpliwość i wolę, aby ustawić przykład do zbadania.Więc gdybyś udzielił odpowiedzi, byłoby to pomocne. – EricG

Odpowiedz

7

Edit: Jest to błąd dokumentacji, ale zachowanie jest zgodne z projektem. Interfejs API zmienił się tak, że deferred.then zachowuje się teraz jak deferred.pipe i nie pozwala już na przekazywanie tablic, ale dokumentacja nie została zaktualizowana, aby to odzwierciedlić.

Powiązane bugów:

I opisać na końcu mojego oryginalnego odpowiedź poniżej stosuje się nadal obejście.


Oryginalny odpowiedź:

Wygląda jak jQuery bug do mnie. Jeśli przechodzą w jednym odniesienia funkcji jako pierwszy argument, to działa, ale nie jeśli przechodzą w tablicy funkcji:

http://jsfiddle.net/tunDH/

Ale the documentation mówi tablicą funkcji jest po prostu w porządku:

doneCallbacks   Funkcja lub zestaw funkcji wywoływanych po rozwiązaniu Odroczonego.

I masz rację. To działa z jQuery 1.7: http://jsfiddle.net/tunDH/1/

Rozwiązaniem byłoby zawinąć wszystko czynność wywołuje wewnątrz pojedynczej funkcji, zamiast wewnątrz tablicy:

$.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/

Prawdopodobnie będziesz potrzebował zrobić to samo z wywołaniami błędów, ale tego nie przetestowałem.

Powiązane problemy