Jawaban ini menggunakan promises, fitur JavaScript ECMAScript 6standar. Jika platform target Anda tidak mendukung promises, isi dengan PromiseJs .
Janji adalah cara baru (dan jauh lebih baik) untuk menangani operasi asinkron dalam 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
});
}
Ini mungkin tampak seperti overhead yang signifikan untuk contoh sederhana ini, tetapi untuk kode yang lebih kompleks itu jauh lebih baik daripada menggunakan panggilan balik. Anda dapat dengan mudah membuat beberapa panggilan tidak sinkron menggunakan banyak thenpernyataan:
function1(someVariable).then(function() {
function2(someOtherVariable);
}).then(function() {
function3();
});
Anda juga dapat membungkus jQuery deferrds dengan mudah (yang dikembalikan dari $.ajaxpanggilan):
Promise.resolve($.ajax(...params...)).then(function(result) {
//whatever you want to do after the request
});
Seperti @charlietfl catat, jqXHRobjek dikembalikan dengan $.ajax()mengimplementasikan Promiseantarmuka. Jadi sebenarnya tidak perlu untuk membungkusnya Promise, itu dapat digunakan langsung:
$.ajax(...params...).then(function(result) {
//whatever you want to do after the request
});
function1melakukan operasi async?