Create a fresh new Promise
with exposed resolve()
& reject()
callbacks available outside of its executor function
npm install flat-promise
const flatPromise = require("flat-promise");
flatPromise()
will return an object containing a new Promise
and its resolve()
and reject()
methods.
const { resolve, reject, promise } = flatPromise();
It's recommended to avoid giving the control of the promise (the resolution methods) beyond the outer scope of where the promise was created - don't return resolve()
or reject()
methods nor keep a reference to the methods in an outer scope.
function doAsyncWork() {
// Get your promise and resolution methods
const { promise, resolve, reject } = flatPromise();
// Do something amazing...
setTimeout(() => {
resolve('done!');
}, 500);
// Pass your promise to the world
return promise;
}
const result = await doAsyncWork();
console.log(result);
flatPromise.withControl()
will return a promise with its resolution methods exposed inside it. It means passing around the promise is also passing around its resolve()
and reject()
methods.
The then()
, catch()
& finally()
methods also return a promise containing resolve()
and reject()
methods.
Notice: This usage makes the promise state harder to maintain and to control.
const promise = flatPromise.withControl();
- or -
const { promise, resolve, reject } = flatPromise.withControl();
function doAsyncWork() {
// Get your promise and resolution methods
const promise = flatPromise.withControl().then(() => "cool!");
// Do something amazing...
setTimeout(() => {
promise.resolve();
}, 500);
// Pass your promise (and control!) to the world
return promise;
}
const result = await doAsyncWork();
console.log(result);
This library basically brings a way to fulfill or reject a promise outside the promise chain. It means that errors thrown in the process of promise settling will not automatically reject the promise and should be catched explicitly! Please see this great explanation for more information about throw safety.