From 0270b727bbf0775da9c9896880e9bb0c0b95d54c Mon Sep 17 00:00:00 2001 From: Tackoil Date: Tue, 8 Mar 2022 08:54:10 +0000 Subject: Add the explanation about the executor in Promise() --- .../global_objects/promise/promise/index.html | 52 +++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) (limited to 'files') diff --git a/files/zh-cn/web/javascript/reference/global_objects/promise/promise/index.html b/files/zh-cn/web/javascript/reference/global_objects/promise/promise/index.html index 1f4a6d5762..a81af18ffe 100644 --- a/files/zh-cn/web/javascript/reference/global_objects/promise/promise/index.html +++ b/files/zh-cn/web/javascript/reference/global_objects/promise/promise/index.html @@ -17,9 +17,59 @@ translation_of: Web/JavaScript/Reference/Global_Objects/Promise/Promise
executor
-
这是一个双参函数,参数为resolve和rejectPromise的实现会立即执行executor,并传入resolve和reject函数(Promise构造器将会在返回新对象之前executor)。当resolvereject函数被调用时,它们分别对promise执行resolverejectexecutor通常会触发一些异步运算,一旦运算成功完成,则resolve掉这个promise,如果出错则reject掉。如果executor函数执行时抛出异常,promise状态会变为rejectedexecutor的返回值也会被忽略。
+
+

该函数将在构造这个新Promise对象过程中,被构造函数执行。该executor是一段将输出与promise联系起来的自定义代码。executor的函数签名应为:

+
function(resolutionFunc, rejectionFunc){
+      // 通常是一些异步操作
+    }
+   
+

+ resolutionFuncrejectionFunc也是函数,可以使用任何名字。这两个函数的签名很简单:接受任何类型的单个参数。 +

+
+        resolutionFunc(value) // 当被敲定时调用
+        rejectionFunc(reason) // 当被拒绝时调用
+   
+

+ 当该promise动态插入promise链的情况下,该resolutionFuncvalue参数可能是另一个promise对象。 +

+

+ 关于executor,需理解以下几点: +

+
    +
  • executor的返回值将被忽略。
  • +
  • 如果在该executor中抛出一个错误,该promise将被拒绝。
  • +
+

+ 因此,executor的代码生效的原理如下: +

+
    +
  • 在构造函数生成新Promise对象时,构造函数也生成了一对相关的函数resolutionFuncrejectionFunc。他们被绑定在了Promise对象上。
  • +
  • executor内的代码有机会执行一些操作,然后通过分别调用resolutionFunc或者rejectionFunc,反应这些操作的结果(如果这些结果不是另一个Promise对象的话),要么为已敲定(resolved),要么为已拒绝(rejected)。
  • +
  • 换句话说,executor中的代码通过resolutionFuncrejectionFunc产生的副作用进行通信。这里的副作用是指Promise对象变成已敲定(resolved),要么为已拒绝(rejected)。
  • +
+

+ 综上所述,对典型流程进行总结: +

+
    +
  1. executor内的操作是异步的,并且提供一个回调(callback)。
  2. +
  3. 该回调在executor内定义。
  4. +
  5. 该回调通过调用resolutionFunc终止。
  6. +
  7. resolutionFunc的调用包含一个value参数。
  8. +
  9. value被返回给绑定的Promise对象上。
  10. +
  11. Promise对象(异步地)调用任何相关的.then(handleResolved)
  12. +
  13. .then(handleResolved)收到的value作为入参被传递给了handleResolved的调用。(参见Promise的链式调用
  14. +
+
+

返回值

+
+

+ 当通过new调用时,Promise构造函数返回一个promise对象。当resolutionFunc或者rejectionFunc被调用时,该promise对象将会“被敲定”。注意,如果您调用resolutionFunc或者rejectionFunc时将另一个Promise对象作为参数,您可以称其“被敲定(resolved)”,但仍不能称其“被解决(settled)”。 +

+
+

例子

我们通过new关键字和Promise构造器创建它的对象。这个构造器接受一个名为"executor function"的函数。这个函数应当接受两个函数参数。当异步任务成功时,第一个函数(resolve)将被调用,并返回一个值代表成功。当其失败时,第二个函数(reject)将被调用,并返回失败原因(失败原因通常是一个error对象)。

-- cgit v1.2.3-54-g00ecf