promise-for-es

A ES2021 Promise implementation based on ES3 has high compatibility, and comply with ECMA-262 and Promises/A+

Usage no npm install needed!

<script type="module">
  import promiseForEs from 'https://cdn.skypack.dev/promise-for-es';
</script>

README

Promises/A+ logo

简体中文 | English

Promise For ES

✨ A ES2021 Promise implementation based on ES3 has high compatibility, and comply with ECMA-262 and Promises/A+

The best way to learn Promise is to implement it.

Feature

  1. Base on ES3, almost all browsers are supported;
  2. Comply with ECMA-262 and Promises/A+, pass the Promises/A+ compliance test, and other related tests;
  3. Implement the new features about Promise of ES2018、ES2020、ES2021;

Support

|Ability|Version|Support| |-|:-:|:-:| |new Promise(executor)|ES2015|✔| |Promise.prototype.then(onFulfilled, onRejected)|ES2015|✔| |Promise.prototype.catch(onRejected)|ES2015|✔| |Promise.prototype.finally(onFinally)|ES2018|✔| |Promise.resolve(value)|ES2015|✔| |Promise.reject(reason)|ES2015|✔| |Promise.all(iterable)|ES2015|✔| |Promise.race(iterable)|ES2015|✔| |Promise.allSettled(iterable)|ES2020|✔| |Promise.any(iterable)|ES2021|✔|

Install

npm i -S promise-for-es

Usage

  1. As a polyfill
// ES Module
import 'promise-for-es/polyfill';
// CommonJS
require('promise-for-es/polyfill');
  1. As a ponyfill
// ES Module
import Promise from 'promise-for-es';
// CommonJS
const Promise = require('promise-for-es');

Core logic

Using the example below:

const executor = (resolutionFunc, rejectionFunc) => {
    // business logic
};
const p1 = new Promise(executor);
p1.then(onFulfilled, onRejected);

p1.then(onFulfilled, onRejected)

  1. Create a new Promise object p2 ;
  2. Check the state of p1 :
    1. If "pending", push onFulfilled into the fulfill list of p1, and push onRejected into the reject list;
    2. If "fulfilled", create a micro task with onFulfilled, p2 and the result of p1 ;
    3. If "rejected", create a micro task with onRejected, p2 and the result of p1 ;
  3. return p2 ;

new Promise(executor)

  1. Create the resolving functions: resolutionFunc, rejectionFunc ;
  2. Call executor with resolutionFunc and rejectionFunc as the arguments;

resolutionFunc(value)

  1. If any resolving function has been called, return;
  2. If value is thenable, create a micro task with value, return;
  3. Change the state of p1 to "fulfilled";
  4. Create a micro task for each element of fulfill list;

rejectionFunc(reason)

  1. If any resolving function has been called, return;
  2. Change the state of p1 to "rejected";
  3. Create a micro task for each element of reject list;

Test

  1. npm run test:aplus to run Promises/A+ compliance test;
  2. npm run test:es6 to run promises-es6-tests;
  3. npm run test:core-js to run the core-js tests about Promise;

Reference

  1. ECMA-262
  2. Promises/A+