Skip to content

Repository files navigation

MutablePromise

Wrapper for Promise. Resolvable, rejectable, redirectable.


Import


install

npm i mutable-promise -S
yarn add mutable-promise

import

importMutablePromisefrom'mutable-promise';
constMutablePromise=require('mutable-promise');

CDN

<scripttype="module">importMutablePromisefrom'https://cdn.jsdelivr.net/npm/mutable-promise@1.1.15/dist/index.esm.min.js';</script>
<scriptsrc="https://cdn.jsdelivr.net/npm/mutable-promise@1.1.15/dist/index.min.js"></script>

Example


resolve outside of the executor. Get status of the promise.

// can use like a native `Promise`letp=newMutablePromise((_,rj)=>setTimeout(rj,100));// try to reject after 100ms// can get statusconsole.log(p.status);// "pending"console.log(p.isPending);// true// can resolve outsidep.then(anything=>console.log(anything));// 'resolve called' p.resolve('resolve called');// resolve immediatelyconsole.log(p.status);// "fulfilled"console.log(p.isFulfilled);// true(async()=>{awaitnewPromise(rs=>setTimeout(rs,200));// wait 200ms// status will not change after `fulfilled` or `rejected`console.log(p.status);// "fulfilled"console.log(p.isFulfilled);// true})();

reject outside of the executor.

letp=newMutablePromise(rs=>setTimeout(rs,100));// try to resolve after 100ms// can reject outsidep.catch(anything=>console.log(anything));// 'reject called'p.reject('reject called');// reject immediatelyconsole.log(p.status);// "rejected"console.log(p.isRejected);// true

Allow setting a promise as argument.

// simple promisenewMutablePromise(Promise.resolve('1'));// typical promiseletnativeP=newPromise(rs=>setTimeout(rs,200));newMutablePromise(nativeP);// wrapper a fetchnewMutablePromise(fetch('./'));// nested MutablePromiseletp=newMutablePromise(rs=>setTimeout(rs,200));newMutablePromise(p);// promise likeletpLike={then: function(){return'a';}};newMutablePromise(pLike);

Allow setting no argument or null. Then define a task later.

letp=newMutablePromise();// or `new MutablePromise(null)`p.then(anything=>console.log(anything));// 'msg from later define task'// The property `task` can accept the same parameter type as the constructor of `MutablePromise`p.task=rs=>rs('msg from later define task');

Can change task before fulfilled or rejected.

letp=newMutablePromise(rs=>setTimeout(()=>{rs('original task')},100));p.then(anything=>console.log(anything));// 'new task'p.task=newMutablePromise(rs=>setTimeout(()=>{rs('new task')},200));

A change make no sense after fulfilled or rejected.

letp=newMutablePromise(Promise.resolve('resolved'));p.then(anything=>console.log(anything));// 'resolved'(async()=>{// wait next js event loopawaitnewPromise(rs=>setTimeout(rs,0));console.log(p.status);// "fulfilled"p.catch(anything=>console.log(anything));// will not log anythingp.task=Promise.reject('make no sense');awaitnewPromise(rs=>setTimeout(rs,0));p.task=(rs)=>{console.log('function still run after `fulfilled` or `rejected`');rs('but will not resolve or reject');};})();

Set task as null can cancel the orignial task.

letp=newMutablePromise(resolve=>setTimeout(()=>{console.log('the executor will run anyway');resolve('original task');},100));p.then(anything=>console.log(anything));// will not log anythingp.task=null;// the promise will keep `pending`setTimeout(()=>{console.log(p.status);},200)// you can define a new `task` later

If a MutablePromise has been fulfilled or rejected, you can define a new MutablePromise instead.

(async()=>{letp=newMutablePromise(Promise.resolve());awaitnewPromise(rs=>setTimeout(rs,0));// wait next js event loopconsole.log(p.status);// "fulfilled"p=newMutablePromise(resolve=>setTimeout(()=>{resolve('you can define a new `MutablePromise` instead')},100));p.then(anything=>console.log(anything));})();

TODO

Maybe need to wrap other promise function like all, resolve, race and so on, to MutablePromise edition.

About

Wrapper for Promise. Resolvable, rejectable, redirectable.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages