Skip to content

PromiseA+规范的学习 以及 SSPromise(Simple Synchronous Promise)的实现

仓库地址

PromiseA+规范
Promise 库
本次调试源码仓库

读前说明

  1. 根据 PromiseA+规范,此仓库对代码具体位置进行标记。
  2. 添加了部分个人觉得便于理解该实现有用的中文注释。
  3. 只保留了源码部分,更好的结合源码分析。更改了 promise/A+测试集的调用方式。具体实现参照另一个库 promises-tests。
  4. 只考虑前端会涉及的 Promise 使用。
  5. 添加了 SSPromise 的实现。
  6. 重写了 Promise.all/Promise.allSetteled 方法。(通过了 promise 库原先的测试)。

Promise 库

  • 在不支持 Promise 的环境下允许你使用 Promise 的写法。而具体事件队列的功能是通过 asap 这个库提供的。
  • Promise 是优雅地书写异步代码的一种方案,而非异步本身。
  • 这只是一个模拟,Promise 静态方法实现存在一些边界条件问题。

SSPromise

(Simple Synchronous Promise)

缘由

  • 个人在开发 vue + vuex 项目时实现的一个方法。通过该方法可以在 store.mutations 中进行数据处理,然后决定 sspromise 的状态。在具体组件中通过 sspromise.then/ .catch / .finally 进行组件内部或全局提示框的唤起等大量模块间同步调用的函数。
  • 如果你对 ES6-Promise 或 Promise/A+ 比较熟悉。 相信很容易理解两者的区别。反之,该 sspromise 目录会影响你对于 promise/A+的学习,不建议参考。

功能

  1. 在不使用任务队列的情况下支持 new SSPromise, then, catch, finally 用法
  2. 不支持 resolve, reject 一个 SSPromise 实例
  3. 用在渲染逻辑与数据处理逻辑分离的场景。如 vue&vuex。
  4. 支持对单个 SSPromise 实例链式调用 then, catch, finally。
  5. 支持对单个 SSPromise 实例添加多个 then。
  6. 支持在若干时间后改变 SSPromise 实例的状态。
  7. 支持 SSPromise 上的静态方法 resolve, reject, all。

上述实现跟 promise 库一致,只是为了满足自身使用需求,简化了不少 PromiseA+规范需求的设定

测试方案

  • npm run test: Promise/A+测试 跟 promise 这个库的代码一样,测试的是 Promise 的实现
  • npm run ssp-test: SSPromise 的简单用例测试