Programing

반환 값과 Promise.resolve의 차이점은 then ()에서

lottogame 2020. 3. 19. 08:16
반응형

반환 값과 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]

링크 : https://promisesaplus.com/#point-49


두 예제 모두 거의 동일하게 동작해야합니다.

then()핸들러 내에서 리턴 된 값은 해당 약속에서 리턴 된 약속의 해상도 값이 then()됩니다. 내부에 반환 된 값 .then이 약속 인 경우, 약속이 반환 된 then()약속은 해당 약속의 "상태를 채택"하고 반환 된 약속과 마찬가지로 해결 / 거부됩니다.

첫 번째 예제에서는 "bbb"첫 번째 then()핸들러로 리턴 하므로 "bbb"다음 then()핸들러 로 전달됩니다 .

두 번째 예에서는 값으로 즉시 해결되는 약속을 반환 "bbb"하므로 "bbb"다음 then()처리기 로 전달됩니다 . ( Promise.resolve()여기서는 이질이 없다).

결과는 같습니다.

실제로 다른 행동을 나타내는 예를 보여 주면 왜 그런 일이 발생했는지 알려줄 수 있습니다.


간단히 말해서 then핸들러 함수 내에서 :

A) x값 (숫자, 문자열 등)은 언제 입니까?

  1. return x 에 해당 return Promise.resolve(x)
  2. throw x 에 해당 return Promise.reject(x)

B) x약속이 언제 정산 되었습니까 (더 이상 보류 중이 아님) :

  1. return xreturn Promise.resolve(x)약속이 이미 해결 된 경우 와 같습니다 .
  2. return xreturn Promise.reject(x)약속이 이미 거부 된 경우 와 같습니다 .

C) x보류중인 약속은 언제 입니까?

  1. 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 및 기본 약속 등)을 용이하게하고 전체적인 삶을 편하게 만듭니다. 약속 해결이 발생할 때마다 전체 일관성을 생성하는 해결이 발생합니다.

참고 URL : https://stackoverflow.com/questions/27715275/whats-the-difference-between-returning-value-or-promise-resolve-from-then

반응형