问题是标题。我试图更深入地了解诺言,并且我想通过查看MDN上的示例来弄清楚Promise.resolve(thenable)
的工作原理,或者至少主要是它的工作原理。我想知道两者之间是否有区别。我整理了这个示例,以说明它们的行为相同,我认为如果有的话,它们会表现出不同的行为。但是显然,仅凭此测试不足以得出结论,它们没有什么不同,所以我来了。
let thenable = {
then(resolve) {
setTimeout(()=>{
resolve((()=>{
console.log('test');
return thenable;
})());
}, 1000);
},
};
let p1 = Promise.resolve(thenable);
let p2 = new Promise(thenable.then);
答案 0 :(得分:4)
在您的示例中,两者的工作原理基本相同。您是对的,将resolve
和reject
传递给thenable的then
方法调用是在您使用thenable对象解决承诺时基本上会发生的事情。
但是,有一些区别:
then
方法被称为onable对象的方法(在this
上下文上),与您的new Promise(thenable.then)
不同-.bind(thenable)
解决这个问题。Promise.resolve
(显然)必须首先检查所传递的对象是否完全可以翻译,它还可以处理访问(而非调用).then
引发的晦涩情况时间上的细微差异: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");
答案 1 :(得分:2)
这两个结构(Promise.resolve(thenable)
和new Promise(thenable.then)
)之间应该没有任何区别
resolve, reject
作为参数。then(resolve) { ... }
内引发错误,则将隐式捕获该错误,并且承诺将被拒绝。then(resolve) { ... }
解决thenable
会导致无限递归。答案 2 :(得分:-1)
您必须了解差异。
thenable就是具有then-method方法的任何对象。异步函数对象的承诺和返回既可以,也可以自定义。
异步函数对象是没有承诺的!他们对自己的回报作出了承诺。
承诺是最复杂的物资类型。它们提供了诸如catch和finally的其他方法,还具有诸如Promise.all和Promise.resolve之类的静态方法。
您的p1传递的方法名称表示一个(通常)已解析的Promise,其值可为。 <-通常在初始化时解决,但由于您提供可转换的值
您的p2使用thenable.then创建一个未解决的Promise,然后作为resolve的回调。 <-初始化时未解决
希望这对您有所帮助。