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 .then
lờ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 .then
hoặ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 .then
trình xử lý trả về một giá trị, thì hàm Promise
sẽ 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 Promise
sẽ phân giải với giá trị đã phân giải của chuỗi Promise
. Trình .then
xử 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 .then
hà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 .then
hà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"
});