A utility class for regenerating reusable Promise
behavior.
It works just like Promise
, since it's a Promise
.
import { MLIResume as Resume } from './MLIResume';
const mySync = new Resume();
mySync.reset().then( result => console.log('got', result ));
mySync.resolve('my result'); // got my result
mySync.reset().then( result => console.log('2nd got', result ));
mySync.resolve('my 2nd result'); // 2nd got my 2nd result
mySync.reset().then( result => console.log('3rd got', result ));
mySync.reset().then( result => console.log('4th got', result ));
mySync.reset().then( result => console.log('5th got', result ));
mySync.resolve('same result');
// 3rd got same result
// 4th got same result
// 5th got same result
reset()
creates and returns a new Promise
for a resolve()
/reject()
. Keep calling it will return the same reference to the current Promise
until either resolve()
or reject()
is called then the current Promise
will be replaced with a new one (or not if passing false as the 2nd argument, then a release()
is needed to unfreeze this state.)
import { MLIResume as Resume } from './MLIResume';
const mySync = new Resume();
(async () => {
for await ( const x of mySync.repeat( 3 )){ console.log('Resolved:', x )}
})();
mySync.resolve( 10 ); // Resolved: 10
mySync.resolve('is'); // Resolved: is
mySync.resolve({ a: Number }); // Resolved: {a: Ζ}
// repeat(3), no more resolve.
Without any argument, it will be repeating infinitely but can be terminated by calling reject()
(async () => {
for await ( const x of mySync.repeat()){ console.log('Resolved:', x )}
})();
mySync.resolve('I');
mySync.resolve('love');
mySync.reject('me.');
You can pass a function as argument. Returning false will end the repeat()
.
(async () => {
for await ( const x of mySync.repeat( v => v !== 'end')){ console.log('Resolved:', x )}
})();
mySync.resolve( 10 ); // Resolved: 10
mySync.resolve('end'); // end!
Poll until the callback argument return true.
import { MLIResume as Resume } from './MLIResume';
(async () => {
const resume = new Resume();
const result = await resume.return( v => v > 2 ));
console.log( result, "> 2 !" ); // 3
})();
//...
mySub.resolve(1); // ...Nothing
mySub.resolve(2); // ...Nothing
mySub.resolve(3); // 3 > 2 !
An error-handling callback can be provided as the 2nd argument, which may return true to ignore rejected values, that are ignored by default.
Like repeat()
, subscribe()
will be polling for the callback until the returned unsubscribe function is called.
import { MLIResume as Subscription } from './MLIResume';
const mySub = new Subscription();
const unsub = mySub.subscribe( cbValue => console.log('Resolved:', cbValue ));
mySub.resolve(1); // Resolved: 1
mySub.resolve(2); // Resolved: 2
unsub();
mySub.resolve(3); // ...Nothing!
import { MLIResume as Resume } from './MLIResume';
const mySync = new Resume();
(async () => {
while( true )
switch( await mySync.reset()){
case 1: console.log('I'); break;
case 2: console.log('love'); break;
case 3: console.log('you.'); break;
}
})();
mySync.resolve(1);
mySync.resolve(2);
mySync.resolve(3);
Adding false to resolve( myResult, false )
will prevent reset()
from creating new Promise
which means that all future reset()
will immediately resolved to the last result. The same goes for reject( myError, false )
. You can still call release()
to reset this state.