nop*_*ole 5 javascript es6-promise thenable
我认为迄今为止我采取的一项原则是:
Promise 是一个 thenable 对象,因此它接受消息
then,或者换句话说,某些代码可以使用then履行处理程序调用该对象上的方法,该对象是接口的一部分,这是“下一步要采取的步骤” ,以及拒绝处理程序,这是“如果没有成功则采取的下一步”。通常最好在履行处理程序中返回一个新的 Promise,以便其他代码可以在其上“链接”,也就是说,“我还将告诉您下一步的操作,以及如果失败则下一步的操作,所以当你完成后给他们中的一个打电话。”
然而,在JavaScript.info Promise 博客页面上,它说履行处理程序可以返回任何“thenable”对象(这意味着类似 Promise 的对象),但这个 thenable 对象的接口是
.then(resolve, reject)
Run Code Online (Sandbox Code Playgroud)
这与通常的代码不同,因为如果履行处理程序返回一个新的 Promise,则该 thenable 对象具有接口
.then(fulfillmentHandler, rejectionHandler)
Run Code Online (Sandbox Code Playgroud)
所以该页面上的代码实际上得到了 aresolve并调用resolve(someValue)。如果fulfillmentHandler不只是 的另一个名称resolve,那么为什么 thenable 会有所不同?
该页面上的可用代码:
.then(resolve, reject)
Run Code Online (Sandbox Code Playgroud)
写下整个解释后,简短的答案是:这是因为 JS Promise 系统将 a resolveandreject作为fulfillmentHandlerand传入rejectionHandler。fulfillmentHandler在这种情况下所需的是一个resolve.
当我们有了代码
new Promise(function(resolve, reject) {
// ...
}).then(function() {
return new Promise(function(resolve, reject) {
// ...
});
}).then(function() { ...
Run Code Online (Sandbox Code Playgroud)
我们可以编写相同的逻辑,使用
let p1 = new Promise(function(resolve, reject) {
// ...
});
let p2 = p1.then(function() {
let pLittle = new Promise(function(resolve, reject) {
// ...
resolve(vLittle);
});
return pLittle;
});
Run Code Online (Sandbox Code Playgroud)
返回的行为pLittle意味着:我正在返回一个promise,一个thenable pLittle,。现在,一旦接收者收到此消息pLittle,请确保当我解析pLittle为 value时vLittle,您的目标是立即解析p2为vLittle,以便可链接的操作可以继续进行。
它是如何做到的?
它可能有一些类似的代码:
pLittle.then(function(vLittle) { // ** Our goal **
// somehow the code can get p2Resolve
p2Resolve(vLittle);
});
Run Code Online (Sandbox Code Playgroud)
上面的代码表示:当pLittle用 解析时,下一个操作是用相同的值vLittle解析。p2
所以不知何故系统可以得到p2Resolve,但在系统或“黑匣子”内部,上面的函数
function(vLittle) {
// somehow the code can get p2Resolve
p2Resolve(vLittle);
}
Run Code Online (Sandbox Code Playgroud)
可能p2Resolve(这主要是一个猜测,因为它解释了为什么一切正常)。所以系统会
pLittle.then(p2Resolve);
Run Code Online (Sandbox Code Playgroud)
请记住
pLittle.then(fn)
Run Code Online (Sandbox Code Playgroud)
方法
pLittle传递tofn和 invoke的解析值fn,因此
pLittle.then(p2Resolve);
Run Code Online (Sandbox Code Playgroud)
是相同的
pLittle.then(function(vLittle) {
p2Resolve(vLittle)
});
Run Code Online (Sandbox Code Playgroud)
这与上面完全相同** Our goal**。
它的意思是,系统传递一个“解决”,作为履行处理程序。因此,此时此刻,履行处理程序和解析是同一件事。
请注意,在原始问题的 Thenable 代码中,它确实
return new Thenable(result);
Run Code Online (Sandbox Code Playgroud)
这Thenable不是一个 Promise,你无法解析它,但由于它不是一个 Promise 对象,这意味着 Promise(如p2)会作为返回内容的规则立即解析,这就是then(p2Resolve)立即调用 的原因。
所以我认为这取决于这样一个事实:ES6 Promise 的内部实现将 intop2Resolve作为then()第一个参数传递,这就是为什么我们可以实现任何采用第一个参数resolve并仅调用的thenable resolve(v)。
我认为 ES6 规范很多时候都写出了确切的实现,所以我们可以以某种方式使用它。如果任何 JavaScript 引擎的工作方式略有不同,那么结果可能会发生变化。我想在过去,我们被告知我们不应该知道黑匣子内部发生了什么,也不应该指望它是如何工作的——我们应该只知道接口。因此最好还是不要返回具有接口的 thenable then(resolve, reject),而是返回一个使用该接口的新的、真实的 Promise 对象then(fulfillmentHandler, rejectionHandler)。
| 归档时间: |
|
| 查看次数: |
1327 次 |
| 最近记录: |