
Cả fetch
, $.ajax
và AJAX truyền thống
đều được sử dụng để thực hiện các yêu cầu HTTP (AJAX), nhưng chúng có sự khác biệt đáng kể về cách hoạt động, cú pháp và tính năng. Dưới đây là so sánh chi tiết:
Tiêu chí | fetch | $.ajax | AJAX truyền thống |
---|---|---|---|
Định nghĩa | API hiện đại tích hợp sẵn trong JavaScript để xử lý HTTP requests. | Phương thức của thư viện jQuery hỗ trợ AJAX. | Sử dụng XMLHttpRequest (XHR) tích hợp sẵn trong JavaScript. |
Hỗ trợ trình duyệt | Chỉ hỗ trợ trên các trình duyệt hiện đại (không hỗ trợ IE11). | Hỗ trợ cả trình duyệt cũ như IE8, IE9, IE11. | Hỗ trợ trên tất cả các trình duyệt (bao gồm IE cũ). |
Cú pháp | Ngắn gọn, dựa trên Promise hoặc async/await . |
Sử dụng callback hoặc kết hợp với Deferred . |
Phức tạp hơn, yêu cầu nhiều dòng mã để xử lý (callback, trạng thái XHR). |
Tích hợp JSON | Yêu cầu xử lý JSON thủ công bằng .json() . |
Tự động parse JSON khi cấu hình dataType: 'json' . |
Yêu cầu parse JSON thủ công (ví dụ: JSON.parse(xhr.responseText) ). |
Xử lý lỗi | Qua .catch() hoặc try/catch . |
Xử lý qua callback error . |
Phải tự viết logic kiểm tra trạng thái readyState và status . |
Khả năng mở rộng | Dễ mở rộng bằng cách kết hợp với async/await . |
Dễ dàng tích hợp với các tính năng khác của jQuery (serialize, chaining). | Khó mở rộng, mã phức tạp và khó quản lý khi yêu cầu nhiều chức năng. |
Kích thước thư viện | Không cần thư viện ngoài (tích hợp sẵn). | Yêu cầu tải jQuery (~90KB minified). | Không cần thư viện ngoài. |
Hỗ trợ Promise | Native Promise hỗ trợ đầy đủ, có thể kết hợp với async/await . |
Không hỗ trợ Promise natively, nhưng có thể sử dụng Deferred . |
Không hỗ trợ Promise. |
Hỗ trợ Upload file | Hỗ trợ qua FormData . |
Dễ tích hợp với FormData . |
Hỗ trợ qua FormData , nhưng cú pháp phức tạp hơn. |
Cách sử dụng timeout | Không hỗ trợ timeout trực tiếp, cần dùng AbortController . |
Hỗ trợ timeout dễ dàng thông qua tham số timeout . |
Không có sẵn, phải viết thủ công bằng setTimeout . |
Hiệu suất | Nhanh hơn do không có phụ thuộc vào thư viện. | Hiệu suất chậm hơn do phải tải cả jQuery. | Tương tự fetch, nhưng đòi hỏi nhiều tài nguyên để xử lý thủ công. |
Ví dụ minh họa từng cách#
1. Sử dụng fetch
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) throw new Error('Network response was not ok');
return response.json();
})
.then(data => console.log(data))
.catch(error => console.error('Fetch error:', error));
2. Sử dụng $.ajax
$.ajax({
url: 'https://api.example.com/data',
method: 'GET',
dataType: 'json',
success: function (data) {
console.log(data);
},
error: function (xhr, status, error) {
console.error('AJAX error:', error);
},
});
3. AJAX truyền thống với XHR
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
const data = JSON.parse(xhr.responseText);
console.log(data);
} else if (xhr.readyState === 4) {
console.error('XHR error:', xhr.statusText);
}
};
xhr.send();
Tối ưu hóa và đề xuất sử dụng#
1. Tối ưu hơn về hiệu suất
fetch
: Tốt nhất nếu bạn làm việc trên trình duyệt hiện đại vì không có phụ thuộc vào thư viện, hiệu suất cao hơn.- AJAX truyền thống: Hiệu suất tương tự
fetch
, nhưng yêu cầu nhiều mã hơn để thực hiện các tác vụ đơn giản. $.ajax
: Chậm hơn vì phải tải toàn bộ jQuery, tuy nhiên tích hợp tốt hơn nếu bạn đã sử dụng jQuery.
2. Dễ dàng triển khai
fetch
: Dễ dùng vớiPromise
hoặcasync/await
. Lý tưởng cho dự án hiện đại.$.ajax
: Phù hợp nếu bạn đã dùng jQuery trong dự án, hỗ trợ các tính năng tích hợp như serialize form hoặc timeout dễ dàng.- AJAX truyền thống: Phức tạp nhất vì yêu cầu kiểm soát
readyState
,status
, và callback thủ công.
3. Dự án nên dùng cách nào?
fetch
: Dùng cho dự án mới, hiện đại. Nếu muốn mã ngắn gọn, dễ đọc, sử dụngasync/await
.$.ajax
: Dùng cho dự án cũ đã tích hợp jQuery hoặc cần hỗ trợ trình duyệt cũ (IE11 trở xuống).- AJAX truyền thống: Hạn chế dùng, chỉ phù hợp nếu bạn cần hỗ trợ IE cực kỳ cũ hoặc muốn tối ưu mã hoàn toàn không phụ thuộc.
Tóm lại#
fetch
: Lựa chọn tối ưu cho dự án hiện đại (nhẹ, hiệu suất tốt, dễ bảo trì).$.ajax
: Tốt trong dự án jQuery hoặc cần hỗ trợ trình duyệt cũ.- AJAX truyền thống: Hạn chế sử dụng vì cú pháp phức tạp, khó bảo trì trong các dự án lớn.
Nội dung bài viết