คำตอบนี้ใช้promises
คุณสมบัติ JavaScript ของECMAScript 6
มาตรฐาน หากแพลตฟอร์มเป้าหมายของคุณไม่สนับสนุนpromises
, Polyfill กับPromiseJs
สัญญาเป็นวิธีใหม่ (และดีกว่ามาก) ในการจัดการการดำเนินงานแบบอะซิงโครนัสใน 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
});
}
นี่อาจดูเหมือนเป็นค่าใช้จ่ายที่สำคัญสำหรับตัวอย่างง่ายๆนี้ แต่สำหรับรหัสที่ซับซ้อนกว่านั้นดีกว่าการใช้การเรียกกลับ คุณสามารถเชื่อมโยงการโทรแบบอะซิงโครนัสหลายสายได้อย่างง่ายดายโดยใช้then
คำสั่งหลายรายการ:
function1(someVariable).then(function() {
function2(someOtherVariable);
}).then(function() {
function3();
});
นอกจากนี้คุณยังสามารถตัด jQuery deferrds ได้อย่างง่ายดาย (ซึ่งถูกส่งคืนจากการ$.ajax
โทร):
Promise.resolve($.ajax(...params...)).then(function(result) {
//whatever you want to do after the request
});
ตามที่ @charlietfl ตั้งข้อสังเกตjqXHR
วัตถุที่ส่งกลับโดย$.ajax()
ใช้Promise
อินเทอร์เฟซ ดังนั้นจึงไม่จำเป็นต้องห่อไว้ใน a Promise
สามารถใช้โดยตรง:
$.ajax(...params...).then(function(result) {
//whatever you want to do after the request
});
function1
ทำการดำเนินการ async