반환 값과 Promise.resolve의 차이점은 then ()에서
차이점은 무엇입니까?
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()
핸들러 내에서 리턴 된 값은 해당 약속에서 리턴 된 약속의 해상도 값이 then()
됩니다. 내부에 반환 된 값 .then
이 약속 인 경우, 약속이 반환 된 then()
약속은 해당 약속의 "상태를 채택"하고 반환 된 약속과 마찬가지로 해결 / 거부됩니다.
첫 번째 예제에서는 "bbb"
첫 번째 then()
핸들러로 리턴 하므로 "bbb"
다음 then()
핸들러 로 전달됩니다 .
두 번째 예에서는 값으로 즉시 해결되는 약속을 반환 "bbb"
하므로 "bbb"
다음 then()
처리기 로 전달됩니다 . ( Promise.resolve()
여기서는 이질이 없다).
결과는 같습니다.
실제로 다른 행동을 나타내는 예를 보여 주면 왜 그런 일이 발생했는지 알려줄 수 있습니다.
간단히 말해서 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 에서이 주제에 대해 자세히 알아보십시오 .
당신은 이미 좋은 정답을 얻었습니다. 나는 짧은 것을 추가해야한다고 생각했다.
다음은 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 및 기본 약속 등)을 용이하게하고 전체적인 삶을 편하게 만듭니다. 약속 해결이 발생할 때마다 전체 일관성을 생성하는 해결이 발생합니다.
'Programing' 카테고리의 다른 글
UIToolbar에서 왼쪽 화살표 버튼 (예 : UINavigationBar의 "뒤로"스타일 만들기) (0) | 2020.03.19 |
---|---|
C ++와 C 결합-#ifdef __cplusplus는 어떻게 작동합니까? (0) | 2020.03.19 |
Windows의 Node.js에서 hello.js 파일을 실행하는 방법은 무엇입니까? (0) | 2020.03.19 |
위도 및 경도 데이터를 SQL 데이터베이스에 저장할 때 어떤 데이터 유형을 사용해야합니까? (0) | 2020.03.19 |
html 요소에 여러 개의 ID가있을 수 있습니까? (0) | 2020.03.19 |