promise 의 then 에서 반환값 또는 resoleve 의 차이점은 무엇입니까?
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return "bbb";
})
.then(function(result) {
console.log(result);
});
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return Promise.resolve("bbb");
})
.then(function(result) {
console.log(result);
});
.then ()과 함께 Angular 및 $ http 서비스를 사용하여 다른 동작을 겪고 있습니다. 코드가 너무 많으므로 먼저 위의 예입니다.
답변
규칙은 then
핸들러에있는 함수가 값을 리턴하면 약속이 해당 값으로 해석 / 거부되며 함수가 약속을 리턴하면 다음 then
절은 함수가 리턴 한 약속의then
절입니다 . 그래서,이 경우, 첫 번째 예는 정상적인 순서를 내리는 thens
당신이 할 때 하나가, 두 번째 예에서 약속 개체가 반환됩니다 것을 예상대로 값을 밖으로 인쇄 Promise.resolve("bbb")
후 ‘s를 인 then
경우 체인 불려 가도록을 (모든 의도와 목적을 위해). 실제로 작동하는 방식은 아래에 자세히 설명되어 있습니다.
Promises / A + 사양에서 인용 :
약속 해결 절차는 약속과 값을 입력으로 취하는 추상 연산으로, 우리는로 표시합니다
[[Resolve]](promise, x)
. 만약x
그렇다면, x는 적어도 어느 정도는 약속처럼 행동한다는 가정하에 약속 의 상태를 채택x
하려고 시도한다 . 그렇지 않으면 값으로 약속을 이행합니다x
.이러한 thenables의 처리는 Promises / A + 호환 then 메소드를 노출하는 한 약속 구현이 상호 운용되도록합니다. 또한 Promises / A + 구현은 부적합한 구현을 합리적인 방법으로 “어셈블리”할 수 있습니다.
여기서 주목해야 할 것은 다음 줄입니다.
x
약속 이라면 그 상태를 채택하라 [3.4]
답변
간단히 말해서 then
핸들러 함수 내에서 :
A) x
값 (숫자, 문자열 등)은 언제 입니까?
return x
에 해당return Promise.resolve(x)
throw x
에 해당return Promise.reject(x)
B) x
약속이 이미 정해 졌을 때 (더 이상 보류되지 않음) :
return x
return Promise.resolve(x)
약속이 이미 해결 된 경우 와 같습니다 .return x
return Promise.reject(x)
약속이 이미 거부 된 경우 와 같습니다 .
C) x
보류중인 약속은 언제 입니까?
return x
보류중인 약속을 반환하고 이후에 평가됩니다then
.
Promise.prototype.then () docs 에서이 주제에 대해 자세히 알아보십시오 .
답변
두 예제 모두 거의 동일하게 동작해야합니다.
내부에 반환 된 값 then()
핸들러 값은 해당 약속에서 리턴 된 약속의 해상도 값이 then()
됩니다. 내부에 반환 된 값 .then
이 약속 인 경우, 약속이 반환 된 then()
약속은 해당 약속의 “상태를 채택”하고 반환 된 약속과 마찬가지로 해결 / 거부됩니다.
첫 번째 예에서는 "bbb"
첫 번째 then()
핸들러로 하므로 "bbb"
다음 then()
핸들러 로 전달됩니다 .
두 번째 예에서는 값으로 즉시 해결되는 약속을 반환합니다. "bbb"
하므로 "bbb"
다음 then()
처리기 로 전달됩니다 . ( Promise.resolve()
여기서는 무관합니다).
결과는 같습니다.
실제로 다른 행동을 나타내는 예를 보여 주면 그 이유가 무엇인지 알려줄 수 있습니다.
답변
당신은 이미 좋은 정답을 얻었습니다. 나는 짧은 것을 추가해야한다고 생각했다.
다음은 Promises / A + 약속 과 동일 합니다.
- 호출
Promise.resolve
(귀하의 Angular 경우$q.when
) - promise 생성자를 호출하고 리졸버를 해결합니다. 귀하의 경우에는입니다
new $q
. then
콜백 에서 값을 반환합니다 .- 값이있는 배열에서 Promise.all을 호출 한 다음 해당 값을 추출하십시오.
따라서 다음은 약속 또는 일반 가치 X에 대해 동일합니다.
Promise.resolve(x);
new Promise(function(resolve, reject){ resolve(x); });
Promise.resolve().then(function(){ return x; });
Promise.all([x]).then(function(arr){ return arr[0]; });
약속 사양은 Promise Resolution Procedure 를 기반으로하여 라이브러리 간의 상호 운용 ($ q 및 기본 약속 등)을 용이하게하고 인생을 전반적으로 편하게 만듭니다. 약속 해결이 발생할 때마다 전체 일관성을 생성하는 해결이 발생합니다.