2012-10-17 22 views
6

Đoạn mã này hoạt động trong 1.7.2 với cả lời gọi lại thành công/lỗi cũng như lời hứa gọi lại kiểu gọi lại. Với 1.8.2 callbacks thành công/error vẫn làm việc nhưng những lời hứa không. Linh cảm của tôi là dòng return dfd.promise(jqXHR); là vấn đề nhưng tôi không chắc chắn.Lời hứa của tôi không còn hoạt động trong 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); 
}); 

Cập nhật: Đây là yêu cầu ajax của tôi thất bại:

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

Yêu cầu của bạn có đồng bộ không? Nếu vậy, nó sẽ không hoạt động với 'jqXHR'. Từ tài liệu: "Kể từ jQuery 1.8, việc sử dụng async: false với jqXHR ($ .Deferred) không còn được dùng nữa; bạn phải sử dụng lệnh gọi lại thành công/thành công/lỗi". – bfavaretto

+0

Không, đã thêm yêu cầu ajax của tôi vào bài đăng – ryan

+0

Bạn có quen với trình gỡ lỗi Chrome không? >. < Bài đăng của bạn có thể được trả lời bởi những người: 1 có thể làm việc với cùng một thứ chính xác (hoặc thực hiện nghiên cứu). 2 có sự kiên nhẫn và sẽ thiết lập một ví dụ để điều tra.Vì vậy, nếu bạn cung cấp một câu trả lời nó sẽ là hữu ích. – EricG

Trả lời

7

Edit: Đây là một lỗi tài liệu, nhưng hành vi này là do thiết kế. Api thay đổi sao cho deferred.then hiện hoạt động như deferred.pipe và không cho phép truyền các mảng nữa, nhưng tài liệu chưa được cập nhật để phản ánh điều đó.

lỗi liên quan:

Cách giải quyết tôi mô tả ở phần cuối của câu trả lời ban đầu của tôi dưới đây vẫn được áp dụng.


Original câu trả lời:

Nó trông giống như một lỗi jQuery với tôi. Nếu bạn vượt qua trong một tài liệu tham khảo chức năng duy nhất là đối số đầu tiên, nó hoạt động, nhưng không phải nếu bạn vượt qua trong một loạt các chức năng:

http://jsfiddle.net/tunDH/

Nhưng, the documentation nói một loạt các chức năng được tốt:

doneCallbacks   Một chức năng hoặc một loạt hàm, được gọi khi Hoãn được giải quyết.

Và, bạn nói đúng. Nó làm việc với jQuery 1.7: http://jsfiddle.net/tunDH/1/

Một cách giải quyết sẽ để bọc tất cả chức năng của bạn gọi bên trong một hàm duy nhất, thay vì bên trong một mảng:

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

Bạn có lẽ sẽ cần để làm điều tương tự với lỗi gọi lại, nhưng tôi đã không kiểm tra điều đó.

Các vấn đề liên quan