นอกจากนี้ยังมีความแตกต่างในวิธีการประมวลผลผลลัพธ์ที่ส่งคืน (เรียกว่าการโยง, done
ไม่โยงในขณะที่then
สร้างสายเรียก)
promise.then(function (x) { // Suppose promise returns "abc"
console.log(x);
return 123;
}).then(function (x){
console.log(x);
}).then(function (x){
console.log(x)
})
ผลลัพธ์ต่อไปนี้จะถูกบันทึกไว้:
abc
123
undefined
ในขณะที่
promise.done(function (x) { // Suppose promise returns "abc"
console.log(x);
return 123;
}).done(function (x){
console.log(x);
}).done(function (x){
console.log(x)
})
จะได้รับสิ่งต่อไปนี้:
abc
abc
abc
---------- อัปเดต:
Btw ฉันลืมที่จะพูดถึงถ้าคุณส่งคืนสัญญาแทนค่าประเภทอะตอมสัญญาภายนอกจะรอจนกว่าสัญญาภายในจะแก้ไขได้:
promise.then(function (x) { // Suppose promise returns "abc"
console.log(x);
return $http.get('/some/data').then(function (result) {
console.log(result); // suppose result === "xyz"
return result;
});
}).then(function (result){
console.log(result); // result === xyz
}).then(function (und){
console.log(und) // und === undefined, because of absence of return statement in above then
})
ด้วยวิธีนี้จะกลายเป็นเรื่องตรงไปตรงมาในการเขียนการดำเนินการแบบอะซิงโครนัสแบบขนานหรือแบบลำดับเช่น:
// Parallel http requests
promise.then(function (x) { // Suppose promise returns "abc"
console.log(x);
var promise1 = $http.get('/some/data?value=xyz').then(function (result) {
console.log(result); // suppose result === "xyz"
return result;
});
var promise2 = $http.get('/some/data?value=uvm').then(function (result) {
console.log(result); // suppose result === "uvm"
return result;
});
return promise1.then(function (result1) {
return promise2.then(function (result2) {
return { result1: result1, result2: result2; }
});
});
}).then(function (result){
console.log(result); // result === { result1: 'xyz', result2: 'uvm' }
}).then(function (und){
console.log(und) // und === undefined, because of absence of return statement in above then
})
โค้ดด้านบนออกคำขอ HTTP สองชุดพร้อมกันทำให้การร้องขอเสร็จสมบูรณ์เร็วขึ้นขณะที่คำขอ HTTP ที่ต่ำกว่าเหล่านั้นกำลังทำงานตามลำดับจึงช่วยลดภาระของเซิร์ฟเวอร์
// Sequential http requests
promise.then(function (x) { // Suppose promise returns "abc"
console.log(x);
return $http.get('/some/data?value=xyz').then(function (result1) {
console.log(result1); // suppose result1 === "xyz"
return $http.get('/some/data?value=uvm').then(function (result2) {
console.log(result2); // suppose result2 === "uvm"
return { result1: result1, result2: result2; };
});
});
}).then(function (result){
console.log(result); // result === { result1: 'xyz', result2: 'uvm' }
}).then(function (und){
console.log(und) // und === undefined, because of absence of return statement in above then
})