Promise.resolve(thenable) 和 new Promise(thenable.then) 有什么区别?
What is the difference between Promise.resolve(thenable) and new Promise(thenable.then)?
问题是标题。我正在尝试更深入地了解 promises,我想我已经弄清楚 Promise.resolve(thenable)
是如何工作的,或者至少大部分是如何工作的,查看 MDN 上的示例。我想知道两者之间是否有区别。我提出了这个例子来展示它们的行为相同,如果有的话,我认为会以这种方式显示行为差异。但很明显,仅凭这个测试还不足以得出他们没有什么不同的结论,所以我来了。
let thenable = {
then(resolve) {
setTimeout(()=>{
resolve((()=>{
console.log('test');
return thenable;
})());
}, 1000);
},
};
let p1 = Promise.resolve(thenable);
let p2 = new Promise(thenable.then);
这两个构造之间应该没有任何区别(Promise.resolve(thenable)
和 new Promise(thenable.then)
)
- 两者都支持
resolve, reject
作为参数。
- 如果在
then(resolve) { ... }
中抛出错误,它将被隐式捕获并且承诺将被拒绝。
- 用
thenable
解析 then(resolve) { ... }
会导致无限递归。
在您的示例中,两者的工作原理基本相同。你是对的,将 resolve
和 reject
传递给 thenable 的 then
方法调用基本上是当你用 thenable 对象解决承诺时发生的事情。
但是,有一些不同:
- thenable 的
then
方法被称为 thenable 对象上的方法(使用 this
上下文作为),这与您的 new Promise(thenable.then)
不同 - a .bind(thenable)
会解决这个问题。
Promise.resolve
(显然)必须首先检查传递的对象是否是一个 thenable,它还处理访问(而不是调用).then
throws 的模糊情况
时间上的细微差异:Promise.resolve
甚至异步安排 then
调用:
Promise.resolve({
get then() {
console.log("property access");
return function(res, rej) {
console.log("method call");
res("fulfillment");
};
}
}).then(console.log);
console.log("sync execution end");
问题是标题。我正在尝试更深入地了解 promises,我想我已经弄清楚 Promise.resolve(thenable)
是如何工作的,或者至少大部分是如何工作的,查看 MDN 上的示例。我想知道两者之间是否有区别。我提出了这个例子来展示它们的行为相同,如果有的话,我认为会以这种方式显示行为差异。但很明显,仅凭这个测试还不足以得出他们没有什么不同的结论,所以我来了。
let thenable = {
then(resolve) {
setTimeout(()=>{
resolve((()=>{
console.log('test');
return thenable;
})());
}, 1000);
},
};
let p1 = Promise.resolve(thenable);
let p2 = new Promise(thenable.then);
这两个构造之间应该没有任何区别(Promise.resolve(thenable)
和 new Promise(thenable.then)
)
- 两者都支持
resolve, reject
作为参数。 - 如果在
then(resolve) { ... }
中抛出错误,它将被隐式捕获并且承诺将被拒绝。 - 用
thenable
解析then(resolve) { ... }
会导致无限递归。
在您的示例中,两者的工作原理基本相同。你是对的,将 resolve
和 reject
传递给 thenable 的 then
方法调用基本上是当你用 thenable 对象解决承诺时发生的事情。
但是,有一些不同:
- thenable 的
then
方法被称为 thenable 对象上的方法(使用this
上下文作为),这与您的new Promise(thenable.then)
不同 - a.bind(thenable)
会解决这个问题。 Promise.resolve
(显然)必须首先检查传递的对象是否是一个 thenable,它还处理访问(而不是调用).then
throws 的模糊情况
时间上的细微差异:
Promise.resolve
甚至异步安排then
调用:Promise.resolve({ get then() { console.log("property access"); return function(res, rej) { console.log("method call"); res("fulfillment"); }; } }).then(console.log); console.log("sync execution end");