약속은 결과가 아직 해결되지 않는 한 항상 보류 중으로 기록됩니다. .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
메서드에 전달됩니다 .
세부
Promises / A + 사양에 따르면 :
Promise 해결 절차는 Promise와 값을 입력으로받는 추상 연산으로, [[Resolve]] (promise, x)로 표시됩니다. x가 thenable이면 x가 적어도 약속처럼 행동한다는 가정하에 promise가 x의 상태를 채택하도록 시도합니다. 그렇지 않으면 x 값으로 약속을 이행합니다.
이러한 thenables 처리를 통해 Promise / A + 호환 then 메서드를 노출하는 한 promise 구현이 상호 운용 될 수 있습니다. 또한 Promises / A + 구현이 합리적인 then 메서드로 부적합 구현을 "동화"할 수 있습니다.
이 사양은 파싱하기가 조금 어렵 기 때문에 분석해 보겠습니다. 규칙은 다음과 같습니다.
에서 함수 경우 .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"
});