สัญญาจะเข้าสู่ระบบที่รอดำเนินการเสมอตราบใดที่ผลลัพธ์ยังไม่ได้รับการแก้ไข คุณต้องเรียกร้อง.then
ให้สัญญาว่าจะจับผลลัพธ์โดยไม่คำนึงถึงสถานะสัญญา (แก้ไขแล้วหรือยังรอดำเนินการ):
let AuthUser = function(data) {
return google.login(data.username, data.password).then(token => { return token } )
}
let userToken = AuthUser(data)
console.log(userToken) // Promise { <pending> }
userToken.then(function(result) {
console.log(result) // "Some User token"
})
ทำไมถึงเป็นเช่นนั้น?
คำสัญญาเป็นทิศทางไปข้างหน้าเท่านั้น คุณสามารถแก้ไขได้เพียงครั้งเดียว ค่าที่แก้ไขแล้วของ a Promise
จะถูกส่งไปยังเมธอด.then
หรือ.catch
รายละเอียด
ตามข้อกำหนดสัญญา / A +:
ขั้นตอนการแก้ปัญหาสัญญาคือการดำเนินการเชิงนามธรรมโดยใช้การป้อนคำสัญญาและค่าซึ่งเราระบุว่าเป็น [[แก้ไข]] (สัญญา, x) ถ้า x เป็นตัวแปรที่ทำได้ก็จะพยายามให้สัญญายอมรับสถานะของ x ภายใต้สมมติฐานที่ว่า x มีพฤติกรรมคล้ายคำสัญญาอย่างน้อยที่สุด มิฉะนั้นจะเป็นไปตามสัญญาด้วยค่า x
การปฏิบัติตามสัญญานี้ช่วยให้การดำเนินการตามคำสัญญาสามารถทำงานร่วมกันได้ตราบเท่าที่พวกเขาเปิดเผยวิธีการที่เป็นไปตามสัญญา / A + นอกจากนี้ยังช่วยให้การดำเนินการตามสัญญา / A + สามารถ "หลอมรวม" การใช้งานที่ไม่เป็นไปตามข้อกำหนดด้วยวิธีการที่สมเหตุสมผล
ข้อมูลจำเพาะนี้แยกวิเคราะห์ยากเล็กน้อยดังนั้นเรามาทำลายมันลง กฎคือ:
หากฟังก์ชันใน.then
ตัวจัดการส่งคืนค่าค่านั้นPromise
จะแก้ไขด้วยค่านั้น หากดำเนินการส่งกลับอีกPromise
แล้วเดิมแก้ไขด้วยค่ามติของที่ถูกล่ามโซ่Promise
ตัวจัดการPromise
ถัดไป.then
จะมีค่าที่แก้ไขแล้วของสัญญาผูกมัดที่ส่งคืนในก่อนหน้านี้.then
เสมอ
วิธีการใช้งานจริงได้อธิบายไว้ด้านล่างโดยละเอียด:
1. ผลตอบแทนของ.then
ฟังก์ชันจะเป็นค่าที่แก้ไขแล้วของสัญญา
function initPromise() {
return new Promise(function(res, rej) {
res("initResolve");
})
}
initPromise()
.then(function(result) {
console.log(result); // "initResolve"
return "normalReturn";
})
.then(function(result) {
console.log(result); // "normalReturn"
});
2. ถ้า.then
ฟังก์ชันส่งกลับแล้วค่าการแก้ไขสัญญาที่ถูกล่ามโซ่ที่ถูกส่งผ่านต่อไปนี้Promise
.then
function initPromise() {
return new Promise(function(res, rej) {
res("initResolve");
})
}
initPromise()
.then(function(result) {
console.log(result); // "initResolve"
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve("secondPromise");
}, 1000)
})
})
.then(function(result) {
console.log(result); // "secondPromise"
});