2012-10-17 19 views
6

Questo snippet di codice ha funzionato in 1.7.2 con callback sia di successo che di errore e promette callback di stile. Con 1.8.2 i callback di successo/errore continuano a funzionare ma le promesse no. La mia impressione è che la linea return dfd.promise(jqXHR); sia il problema, ma non sono certa.Le mie promesse non funzionano più in 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); 
}); 

Aggiornamento: Ecco la mia richiesta AJAX che non riesce:

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

Le richieste sono sincrone? Se è così, non funzionerà con 'jqXHR'. Da docs: "A partire da jQuery 1.8, l'uso di async: false con jqXHR ($ .Deferred) è deprecato, è necessario utilizzare le callback complete/success/error." – bfavaretto

+0

No, ho aggiunto la mia richiesta Ajax nel post – ryan

+0

Hai familiarità con il debugger di Chrome? >. < Il tuo post può ricevere risposta da persone che: 1 hanno la stessa cosa (o fanno la ricerca). 2 avere la pazienza e la volontà di impostare un esempio per indagare.Quindi se fornissi una risposta sarebbe utile. – EricG

risposta

7

Edit: Questo è un bug di documentazione, ma il comportamento è di progettazione. L'API è stata modificata in modo che deferred.then ora si comporti come deferred.pipe e non consenta più l'inoltro degli array, ma la documentazione non è stata aggiornata per rispecchiare tale aspetto.

bug correlati:

La soluzione che descrivo alla fine della mia risposta originale al di sotto si applica ancora.


risposta originale:

Sembra un bug jQuery per me. Se si passa in un unico riferimento di funzione come primo argomento, funziona, ma non se si passa in una serie di funzioni:

http://jsfiddle.net/tunDH/

Ma, the documentation dice una serie di funzioni è più che bene:

doneCallbacks   Una funzione o una serie di funzioni, chiamate quando il Differito è risolto.

E, hai ragione. Esso funziona con jQuery 1.7: http://jsfiddle.net/tunDH/1/

Una soluzione potrebbe essere quella di avvolgere tutto il vostro chiamate di funzione all'interno di una singola funzione, invece che all'interno di un array:

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

Avrete probabilmente bisogno fare la stessa cosa con i callback degli errori, ma non l'ho verificato.

Problemi correlati