2016-09-28 19 views
9

Cả lời hứa và lời gọi AJAX đều hoạt động không đồng bộ. Yêu cầu GET/POST có thể được thực hiện với cả hai. < < Chỉnh sửa: đó là câu lệnh WRONGSự khác nhau giữa Promise và AJAX là gì?

Vậy sự khác nhau giữa chúng là gì? Và khi nào tốt nhất nên sử dụng cái này thay vì cái kia?

Ngoài ra, một điều nữa:

Gần đây tôi đã gặp một lời hứa có AJAX trong cơ thể. Tại sao đặt một hoạt động async bên trong một hoạt động async? Điều đó giống như đặt một ổ bánh mì trong một bánh sandwich bánh mì.

EDIT: lời xin lỗi của tôi vì đã không cung cấp một ví dụ trước đó:

function threadsGet() { 
return new Promise((resolve, reject) => { 
    $.getJSON('api/threads') 
    .done(resolve) 
    .fail(reject); 
    }) 
} 

jQuery được sử dụng ở đây. Và cuộc gọi AJAX có hành vi và thuộc tính Promise. Tôi đã không nhận được điều đó sớm hơn nhưng đây là những suy nghĩ của tôi: Chúng ta có thể làm điều gì đó trong Lời hứa. Sau đó, sử dụng cuộc gọi AJAX và chức năng done chuyển logic Lời hứa được giải quyết. Cụ thể trong ví dụ này không có.

Bây giờ tôi thấy rằng tôi đã nhầm lẫn cả hai. Chúng có khá nhiều thứ khác nhau. Chỉ vì chúng không đồng bộ, không có nghĩa là chúng có thể hoán đổi cho nhau.

==============

EDIT 2: Chỉ cần một số tài liệu tôi tìm thấy hữu ích:

Promise Anti-Patterns

+0

bạn có thể vui lòng làm rõ ý của bạn là gì khi bạn nói bạn có thể yêu cầu GET/POST bằng _promise_? –

+2

Một lời hứa, tự nó, không có cơ chế để thực hiện các yêu cầu GET/POST. Có lẽ đọc trên [Tài liệu hướng dẫn] (http://stackoverflow.com/documentation/javascript/231/promises/846/introduction#t=201609281521002304613)? –

+2

Lời hứa là một giao diện * cho các hoạt động không đồng bộ. Yêu cầu ajax là một hoạt động không đồng bộ rất cụ thể. – Bergi

Trả lời

24

Bạn đang bối rối về lời hứa và Ajax cuộc gọi. Họ là loại giống như táo và dao. Bạn có thể cắt một quả táo bằng dao và con dao là một công cụ có thể được áp dụng cho một quả táo, nhưng cả hai là những thứ rất khác nhau.

Lời hứa là công cụ để quản lý các hoạt động không đồng bộ. Họ theo dõi khi các hoạt động không đồng bộ hoàn thành và kết quả của chúng là gì và cho phép bạn phối hợp việc hoàn thành đó và các kết quả đó (bao gồm các điều kiện lỗi) với mã khác hoặc các hoạt động không đồng bộ khác. Họ không thực sự là các hoạt động không đồng bộ. Một cuộc gọi Ajax là một hoạt động không đồng bộ cụ thể có thể được sử dụng với giao diện gọi lại truyền thống hoặc được bao bọc trong giao diện lời hứa.

Vậy sự khác nhau giữa chúng là gì? Và khi nào thì tốt nhất nên sử dụng số thay vì cái kia?

Cuộc gọi Ajax là một loại hoạt động không đồng bộ cụ thể. Bạn có thể thực hiện cuộc gọi Ajax với cuộc gọi lại truyền thống bằng cách sử dụng XMLHttpRequest interface hoặc bạn có thể thực hiện cuộc gọi Ajax (trong các trình duyệt hiện đại), sử dụng lời hứa với số fetch() interface.

Gần đây tôi đã gặp phải lời hứa có AJAX trong cơ thể. Tại sao đặt hoạt động không đồng bộ bên trong hoạt động không đồng bộ? Điều đó giống như đặt ổ bánh mì trong bánh mì sandwich.

Bạn không hiển thị mã cụ thể mà bạn đang nói, nhưng đôi khi bạn muốn bắt đầu hoạt động không đồng bộ 1 và sau đó khi hoạt động không đồng bộ đó được thực hiện, bạn muốn họ bắt đầu hoạt động không đồng bộ 2 (thường sử dụng kết quả của cái đầu tiên). Trong trường hợp đó, bạn sẽ thường làm tổ bên trong cái kia.


mã ví dụ của bạn ở đây:

function threadsGet() { 
    return new Promise((resolve, reject) => { 
     $.getJSON('api/threads') 
     .done(resolve) 
     .fail(reject); 
     }) 
} 

được coi là một lời hứa chống mẫu. Không có lý do gì để tạo ra một lời hứa mới ở đây bởi vì $.getJSON() đã trả về một lời hứa mà bạn có thể quay trở lại. Bạn chỉ có thể làm điều này thay vì:

function threadsGet() { 
    return $.getJSON('api/threads'); 
} 

Hoặc, nếu bạn muốn "đúc" lời hứa jQuery hơi phi tiêu chuẩn để một lời hứa tiêu chuẩn, bạn có thể làm điều này:

function threadsGet() { 
    return Promise.resolve($.getJSON('api/threads')); 
} 
+0

Cảm ơn! Đã cập nhật câu hỏi của tôi với ví dụ về AJAX trong lời hứa. Và tôi đã có ý tưởng về nó. :) – Bruno

+0

Cảm ơn rất nhiều vì đã cập nhật! Tôi thậm chí không biết có những thực hành tốt/xấu với lời hứa. Tôi thích mã tối ưu của bạn. Đó là MUCH dễ hiểu hơn và thanh lịch. Điều khiến tôi bối rối trong mã tôi đăng là - Ajax giải quyết sự thành công của lời hứa bên ngoài và (cuối cùng) thất bại trong lỗi của nó. Nhưng giờ đã rõ rồi. :) – Bruno

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