Wrapper for Promise. Resolvable, rejectable, redirectable.
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>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);// trueAllow 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` laterIf 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));})();Maybe need to wrap other promise function like all, resolve, race and so on, to MutablePromise edition.