Skip to content

Latest commit

 

History

History
110 lines (87 loc) · 3.35 KB

README.md

File metadata and controls

110 lines (87 loc) · 3.35 KB
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+