Câu trả lời này sử dụng promises
, một tính năng JavaScript của ECMAScript 6
tiêu chuẩn. Nếu nền tảng mục tiêu của bạn không hỗ trợ promises
, hãy hoàn thành nó với PromiseJs .
Hứa hẹn là một cách mới (và tốt hơn rất nhiều) để xử lý các hoạt động không đồng bộ trong JavaScript:
$('a.button').click(function(){
if (condition == 'true'){
function1(someVariable).then(function() {
//this function is executed after function1
function2(someOtherVariable);
});
}
else {
doThis(someVariable);
}
});
function function1(param, callback) {
return new Promise(function (fulfill, reject){
//do stuff
fulfill(result); //if the action succeeded
reject(error); //if the action did not succeed
});
}
Điều này có vẻ như là một chi phí đáng kể cho ví dụ đơn giản này, nhưng đối với mã phức tạp hơn thì tốt hơn nhiều so với sử dụng các cuộc gọi lại. Bạn có thể dễ dàng xâu chuỗi nhiều cuộc gọi không đồng bộ bằng nhiều then
câu lệnh:
function1(someVariable).then(function() {
function2(someOtherVariable);
}).then(function() {
function3();
});
Bạn cũng có thể dễ dàng bao bọc các trình trì hoãn jQuery (được trả về từ $.ajax
các cuộc gọi):
Promise.resolve($.ajax(...params...)).then(function(result) {
//whatever you want to do after the request
});
Như @charlietfl đã lưu ý, jqXHR
đối tượng được trả về bằng cách $.ajax()
thực hiện Promise
giao diện. Vì vậy, không thực sự cần thiết phải bọc nó trong một Promise
, nó có thể được sử dụng trực tiếp:
$.ajax(...params...).then(function(result) {
//whatever you want to do after the request
});
function1
thực hiện một hoạt động không đồng bộ?