블루 버드를 사용하고 있으며 동기 함수를 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 반환 함수는 일반적으로 비동기 적으로 throw 될 수 있으므로 동 기적으로 throw되지 않아야한다는 보장이 있어야합니다. 예상치 못한 결과와 경쟁 조건을 방지하기 위해 일반적으로 던지는 거부로 변환됩니다.
이를 염두에두고-스펙이 생성되었을 때 promise 생성자는 안전하게 던져집니다.
어떤 경우 someObject
이다 undefined
?
- Way A는 거부 된 약속을 반환합니다.
- 방법 B는 동 기적으로 던집니다.
Bluebird는 이것을 보았고 Petka는 Promise.method
이 문제를 해결하기 위해 추가하여 반환 값을 계속 사용할 수 있습니다. 따라서 Bluebird에서 이것을 작성하는 정확하고 쉬운 방법은 실제로 둘 다 아닙니다.
var someFunction = Promise.method(function someFunction(someObject){
someObject.resolved = true;
return someObject;
});
Promise.method는 throw를 거부로 변환하고 해결로 돌아갑니다. 이 작업을 수행하는 가장 안전한 방법이며 then
반환 값을 통해 능력을 동화 하므로 someObject
실제로 약속 자체 인 경우에도 작동 합니다.
일반적으로 Promise.resolve
Promise에 대한 객체 및 외부 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
전화가 먼저 실행됩니다.
참조 :