返回

PromiseA+规范与浏览器一致性探讨

前端

PromiseA+规范与浏览器一致性

PromiseA+规范定义了Promise对象的行为规范,浏览器对Promise对象的实现也遵循此规范。但是,由于浏览器和Node.js的环境差异,在某些情况下,浏览器和Node.js对Promise对象的处理可能会存在差异。

执行流程

Promise对象是一个异步执行的函数,它可以接收一个函数作为参数,这个函数称为executor。executor函数有两个参数,分别是resolve和reject,用于分别表示Promise对象的状态变为fulfilled或rejected。

当Promise对象的状态变为fulfilled时,会执行then方法中的第一个函数,并将executor函数中的resolve参数传递给该函数。

当Promise对象的状态变为rejected时,会执行then方法中的第二个函数,并将executor函数中的reject参数传递给该函数。

规范差异

浏览器和Node.js对Promise对象的处理存在一些规范差异,主要表现在以下几个方面:

  1. 在reject里面会执行Promise._unhandledRejectionFn方法,由用户自己决定怎么处理这个reject的异常。显然大多数浏览器原生Promise的选择是…

  2. Promise的构造函数必须接受一个函数作为参数,这个函数称为executor。在executor函数中,可以使用resolve和reject来改变Promise对象的状态。

  3. Promise对象的状态只能改变一次,从pending变为fulfilled或rejected。

  4. Promise对象的状态改变后,then方法中的第一个或第二个函数会立即执行。

  5. then方法可以链式调用,即一个then方法的返回值可以作为另一个then方法的参数。

兼容性

为了确保Promise对象在不同的环境中都能正常工作,需要对Promise对象进行兼容性处理。兼容性处理的主要目的是消除浏览器和Node.js对Promise对象的处理差异。

解析

为了消除浏览器和Node.js对Promise对象的处理差异,需要对Promise对象进行解析。解析的主要目的是将浏览器和Node.js的Promise对象转换成一个统一的Promise对象。

规范缺陷

PromiseA+规范存在一些缺陷,这些缺陷可能会导致浏览器和Node.js对Promise对象的处理存在差异。例如,PromiseA+规范没有规定当Promise对象的状态变为fulfilled或rejected时,then方法中的第一个或第二个函数是否应该立即执行。

基于v8的JS引擎

Nodejs和Chrome一样,也是基于v8的JS引擎。所以首先看看再Nodejs下的表现 大意就是,在reject里面会执行Promise._unhandledRejectionFn方法,由用户自己决定怎么处理这个reject的异常。显然大多数浏览器原生Promise的选择是…

用户决定处理异常

在reject里面会执行Promise._unhandledRejectionFn方法,由用户自己决定怎么处理这个reject的异常。显然大多数浏览器原生Promise的选择是…