首页 > 解决方案 > Promise 执行器中的 `resolve` 和 `reject` 函数

问题描述

鉴于客户端程序员既定义并使用resolve传递给Promise执行程序的函数,我天真地假设我完全控制了resolve函数的签名,因此我可以将其定义为接受多个参数。

然而以下代码(jsFiddle)失败了:

<html>
  <script>
   const promise = new Promise(function executor(resolve, reject) {
     setTimeout(function () {
       resolve(42, true);
       }, 1000);
   });
   promise.then(function resolveCallback(answer, howCertain) {
     console.log('callback called with arguments: ('+answer+', '+howCertain+')');
     console.log('the answer is: '+answer+'. I am '+(howCertain?'very':'not very')+' certain about that');
   });
  </script>
</html>

上面的代码实际上打印在控制台上:

callback called with arguments: (42, undefined)
the answer is: 42. I am not very certain about that

深入挖掘,我编写了以下代码(jsFiddle):

<html>
  <script>
   const promise = new Promise(function executor(resolve, reject) {
     console.log('entering executor, resolve is: ['+resolve+']'.);
     setTimeout(function () {
       console.log('about to call resolve');
       resolve(42);
       console.log('returning from resolve');       
       }, 1000);
   });
   console.log('about to call "then"');
   promise.then(function resolveCallback(answer) {
     console.log('the answer is: '+answer);
   });
  </script>
</html>

它实际上在控制台上打印以下内容:

entering executor, resolve is: [function t() { [native code] }]
about to call "then"
about to call resolve
returning from resolve
the answer is: 42

这展示了许多有趣的事情:

Javascript 实现这一点的唯一方法(我能想到的)是该实现实际上是插入某种“代理”resolvereject函数,这些“代理”和函数异步链接到客户端程序员提供的实际函数resolve和函数。reject这也可以解释为什么您不能为resolveandreject函数定义自己的签名:因为管道不起作用。

这个心智模型是正确的还是我错过了什么?

标签: javascript

解决方案


客户端程序员定义传递给 Promise 执行者的解析函数

不,他没有(正如你的实验所证实的那样)。new Promiseexecutor 在创建期间被调用。

当我then兑现承诺时,我不传递resolve我选择的功能吗?

不,您传递了一个onResolve侦听器回调,或者实际上是一个onFulfill回调。

我的新心智模型正确吗?

是的,地表以下有更多的管道。

实际上,new Promise构造函数只是为您提供代理解析器函数。

Promise 包含一个状态机。它是一个表示(一个!)异步结果的对象。因此,您可以.then()在同一个 Promise 对象上多次调用,并且回调将始终传递结果。

它不是函数的包装器executor,它不像你调用的那样频繁地调用执行器then。执行器只被调用一次,让生产者可以访问解析器函数(状态机的输入)。调用的消费者then,观察状态机的输出,与此完全解耦——正如你所说,它们是异步链接的。

也看看这个。对于您的心智模型,是一个易于理解的Promise类实现(不保证异步和错误处理)。


推荐阅读