Lời hứa sẽ luôn ghi nhật ký chờ xử lý miễn là kết quả của nó vẫn chưa được giải quyết. Bạn phải gọi .thenlời hứa để nắm bắt kết quả bất kể trạng thái lời hứa (đã giải quyết hay vẫn đang chờ xử lý):
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"
})
Tại sao vậy?
Lời hứa chỉ là hướng về phía trước; Bạn chỉ có thể giải quyết chúng một lần. Giá trị đã phân giải của mộtPromise được chuyển cho .thenhoặc.catch các phương thức .
Chi tiết
Theo Promises / A + spec:
Thủ tục giải quyết lời hứa là một hoạt động trừu tượng lấy đầu vào là một lời hứa và một giá trị, chúng ta ký hiệu là [[Giải quyết]] (hứa hẹn, x). Nếu x là anable, nó cố gắng thực hiện lời hứa thông qua trạng thái của x, với giả định rằng x hoạt động ít nhất giống như một lời hứa. Nếu không, nó thực hiện lời hứa với giá trị x.
Việc xử lý các khả năng này cho phép các triển khai hứa hẹn tương tác với nhau, miễn là chúng hiển thị phương thức sau đó tuân thủ Promises / A +. Nó cũng cho phép triển khai Promises / A + “đồng hóa” các triển khai không phù hợp với các phương pháp then hợp lý.
Thông số này hơi khó để phân tích cú pháp, vì vậy hãy chia nhỏ nó. Quy tắc là:
Nếu hàm trong .thentrình xử lý trả về một giá trị, thì hàm Promisesẽ giải quyết với giá trị đó. Nếu trình xử lý trả về một giá trị khác Promise, thì bản gốc Promisesẽ phân giải với giá trị đã phân giải của chuỗi Promise. Trình .thenxử lý tiếp theo sẽ luôn chứa giá trị đã phân giải của lời hứa chuỗi được trả về ở phần trước .then.
Cách nó thực sự hoạt động được mô tả chi tiết hơn bên dưới:
1. Kết quả trả về của .thenhàm sẽ là giá trị được giải quyết của lời hứa.
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. Nếu .thenhàm trả về a Promise, thì giá trị đã phân giải của lời hứa chuỗi đó được chuyển đến giá trị sau .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"
});