Promise.resolve 대 새로운 Promise (해결)
나는 bluebird를 사용하고 고유 한 동기 함수를 Promise로 해결하는 두 가지 방법을 보지만 두 가지 방법의 차이점을 얻지. 스택 트레이스가 약간 다른 것 같아서, 또는 alias보입니까?
선호하는 방법은 무엇입니까?
웨이 A
function someFunction(someObject) {
return new Promise(function(resolve) {
someObject.resolved = true;
resolve(someObject);
});
}
웨이 B
function someFunction(someObject) {
someObject.resolved = true;
return Promise.resolve(someObject);
}
댓글의 두 답변과는 달리 차이가 있습니다.
동안
Promise.resolve(x);
기본적으로 다음과 가변합니다.
new Promise(function(r){ r(x); });
미묘함이 있습니다.
Promise 반환 함수는 일반적으로 적으로 던질 수 있으므로 동 기적으로 던질 보장을 가져옵니다. 예상치 못한 결과와 경쟁 조건을 방지하기 위해 일반적으로 던지는 거부로 변환됩니다.
염두에두고-스펙이 생성 할 때 약속을 생성하고 안전하게 처리합니다.
경우 어떤 someObject이다 undefined?
- Way A는 거부 된 약속을 반환합니다.
- 방법 B는 동 기적으로 던집니다.
블루 버드는 Promise.method이 문제를 해결하기 위해 추가하여 반환 값을 계속 사용할 수 있습니다. Bluebird는 이것을 작성하는 것입니다.
var someFunction = Promise.method(function someFunction(someObject){
someObject.resolved = true;
return someObject;
});
Promise.method는 throw를 거부로 변환하고 해결로 돌아갑니다. 작업을 수행이하는 추론 안전한 방법이며 then반환 값을 통해 능력을 동화 하므로 someObject실제로 약속 자체 인 경우에도 작동 합니다.
일반적으로 Promise.resolvePromise에 대한 객체 및 외부 Promise (thenables)를 캐스팅하는 데 사용됩니다. 그것이 유스 케이스입니다.
위의 답변이나 의견에서 언급되지 않은 또 다른 차이점이 있습니다.
경우 someObject대기중인 Promise경우 new Promise(resolve)하나의 추가 틱을 요할 것입니다.
다음 두 코드 스 니펫을 비교하십시오.
const p = new Promise(resovle => setTimeout(resovle));
new Promise(resolve => resolve(p)).then(() => {
console.log("tick 3");
});
p.then(() => {
console.log("tick 1");
}).then(() => {
console.log("tick 2");
});
const p = new Promise(resovle => setTimeout(resovle));
Promise.resolve(p).then(() => {
console.log("tick 3");
});
p.then(() => {
console.log("tick 1");
}).then(() => {
console.log("tick 2");
});
두 번째 스 니펫은 먼저 'tick 3'을 인쇄합니다. 왜?
값이 약속이면
Promise.resolve(value)정확하게 값을 반환합니다.Promise.resolve(value) === value사실입니다. MDN 참조그러나
new Promise(resolve => resolve(value))약속을 따르기 위해 고정 된 새로운 약속을 반환합니다value. '잠금'을 만들기 위해서는 추가 1 틱이 필요합니다.// something like: addToMicroTaskQueue(() => { p.then(() => { /* resolve newly promise */ }) // all subsequent .then on newly promise go on from here .then(() => { console.log("tick 3"); }); });tick 1.then전화가 먼저 실행됩니다.
참조 :
참고 URL : https://stackoverflow.com/questions/26711243/promise-resolve-vs-new-promiseresolve
'ProgramingTip' 카테고리의 다른 글
| HTTP GET에 대한 응답으로 202“Accepted”를 반환하는 것이 잘못입니까? (0) | 2020.10.17 |
|---|---|
| "http | https"가없는 URL (0) | 2020.10.17 |
| PHPDoc : @return void가 필요하고 있습니까? (0) | 2020.10.16 |
| JSP / 서블릿의 숨겨진 기능 (0) | 2020.10.16 |
| iOS에서 파일 쓰기 (0) | 2020.10.16 |