2013-07-23 27 views
22

Fyi, tôi chỉ bắt đầu tìm hiểu các lời hứa jQuery, vì vậy tôi có thể hơi bối rối ở đây.jQuery hoãn lại: Từ chối lời hứa từ bên trong Bộ lọc đã hoàn thành

Dù sao, tôi có một yêu cầu AJAX mà tôi muốn từ chối từ bên trong một bộ lọc thực hiện dựa trên nội dung của câu trả lời:

return doAJAXRequest().then(function (data) { 
    if (data.responseText == "YES") { 
     return doOtherAJAXRequest(); 
    } else { 
     this.reject(data); 
    } 
}); 

đó không làm việc như tôi mong đợi:

Uncaught TypeError: Object #<Object> has no method 'reject' 

Làm cách nào để làm cho lời hứa này thất bại dựa trên phản hồi của nó? Điều đó có thể không? Hay tôi chỉ bối rối về những gì cần phải làm ở đây?

+0

Hãy thử thay đổi this.reject thành $ (this) .reject. – rtimoshenko

+0

@rtimoshenko Bạn có chắc chắn điều đó đúng không? – alex

+0

@rtimoshenko Điều đó dường như không hoạt động, tôi vẫn nhận được lỗi tương tự. Edit: Trên thực tế nó không chính xác giống nhau, nhưng vẫn rất giống nhau. ('Uncaught TypeError: Object [đối tượng Object] không có phương thức 'reject'') – Ajedi32

Trả lời

31

Trong jQuery (không giống như một số libs khác), truyền một lời hứa từ trạng thái 'đã giải quyết' sang trạng thái 'bị từ chối' hơi dài dòng, yêu cầu tạo và loại bỏ rõ ràng một Trì hoãn mới.

function foo() { 
    return doAJAXRequest().then(function (data, textStatus, jqXHR) { 
     if (data.responseText == "YES") { 
      return doOtherAJAXRequest(data); 
     } else { 
      return $.Deferred().reject(jqXHR, data, 'Not YES').promise(); 
     } 
    }); 
) 

Ở đây, lời hứa trả lại nếu data.responseText !== "YES" bắt chước (một phần) một yêu cầu ajax thất bại, trong khi vẫn cho phép data để được thông qua. Đây là (có lẽ) quan trọng đối với bộ xử lý hạ lưu .fail(), điều này phải xử lý cả lỗi ajax chính hãng và điều kiện thành công truyền, mà không biết điều gì xảy ra cho đến khi nó đọc errorThrown.

foo().fail(function(jqXHR, textStatus, errorThrown) { 
    if(errorThrown == 'Not YES') { 
     //transmogrified success 
     var data = textStatus; 
     ... 
    } 
    else { 
     //genuine ajax failure 
     ... 
    } 
}); 

Thường dễ dàng hơn để vượt qua data theo cách này thay vì lấy lại từ đối tượng jqXHR. Điều này đặc biệt đúng với dữ liệu được mã hóa JSON, nếu không sẽ cần được giải mã lần thứ hai trong trình xử lý không thành công.

+2

Tôi không nghĩ rằng phần lời hứa() là cần thiết (hoặc không còn nữa), mà làm cho cuộc gọi chút ít xấu xí/lâu dài. – mikus

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