简体中文 | English
✨ 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.
- Base on ES3, almost all browsers are supported;
- Comply with ECMA-262 and Promises/A+, pass the Promises/A+ compliance test, and other related tests;
- Implement the new features about Promise of ES2018、ES2020、ES2021;
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 | ✔ |
npm i -S promise-for-es
- As a polyfill
// ES Module
import 'promise-for-es/polyfill';
// CommonJS
require('promise-for-es/polyfill');
- As a ponyfill
// ES Module
import Promise from 'promise-for-es';
// CommonJS
const Promise = require('promise-for-es');
Using the example below:
const executor = (resolutionFunc, rejectionFunc) => {
// business logic
};
const p1 = new Promise(executor);
p1.then(onFulfilled, onRejected);
- Create a new Promise object
p2
; - Check the state of
p1
:- If "pending", push
onFulfilled
into the fulfill list ofp1
, and pushonRejected
into the reject list; - If "fulfilled", create a micro task with
onFulfilled
,p2
and the result ofp1
; - If "rejected", create a micro task with
onRejected
,p2
and the result ofp1
;
- If "pending", push
- return
p2
;
- Create the resolving functions:
resolutionFunc
,rejectionFunc
; - Call
executor
withresolutionFunc
andrejectionFunc
as the arguments;
- If any resolving function has been called, return;
- If
value
is thenable, create a micro task withvalue
, return; - Change the state of
p1
to "fulfilled"; - Create a micro task for each element of fulfill list;
- If any resolving function has been called, return;
- Change the state of
p1
to "rejected"; - Create a micro task for each element of reject list;
npm run test:aplus
to run Promises/A+ compliance test;npm run test:es6
to run promises-es6-tests;npm run test:core-js
to run the core-js tests about Promise;