
Security News
OWASP 2025 Top 10 Adds Software Supply Chain Failures, Ranked Top Community Concern
OWASP’s 2025 Top 10 introduces Software Supply Chain Failures as a new category, reflecting rising concern over dependency and build system risks.
promise-toolbox
Advanced tools

Essential utils for promises.
Features:
Installation of the npm package:
> npm install --save promise-toolbox
If your environment may not natively support promises, you should use a polyfill such as native-promise-only.
On Node, if you want to use a specific promise implementation, Bluebird for instance to have better performance, you can override the global Promise variable:
global.Promise = require('bluebird')
Note that it should only be done at the application level, never in a library!
Make your async functions cancellable.
import { cancellable } from 'promise-toolbox'
const asyncFunction = cancellable(async function (cancellation, a, b) {
cancellation.catch(() => {
// do stuff regarding the cancellation request.
})
// do other stuff.
})
const promise = asyncFunction('foo', 'bar')
promise.cancel()
If the function is a method of a class or an object, you can use
cancellable as a decorator:
class MyClass {
@cancellable
async asyncMethod (cancellation, a, b) {
cancellation.catch(() => {
// do stuff regarding the cancellation request.
})
// do other stuff.
}
}
Discouraged but sometimes necessary way to create a promise.
import { defer } from 'promise-toolbox'
const { promise, resolve } = defer()
promise.then((value) => {
console.log(value)
})
resolve(3)
Easiest and most efficient way to promisify a function call.
import { fromCallback } from 'promise-toolbox'
fromCallback((cb) => fs.readFile('foo.txt', cb))
.then((content) => {
console.log(content)
})
import { isPromise } from 'promise-toolbox'
if (isPromise(foo())) {
console.log('foo() returns a promise')
}
Easiest and most efficient way to wait for a fixed amount of promises.
import { join } from 'promise-toolbox'
join(getPictures(), getComments(), getTweets(), (pictures, comments, tweets) => {
console.log(`in total: ${pictures.length + comments.length + tweets.length}`)
})
This function can be used as if they were methods, i.e. by passing the promise (or promises) as the context.
This is extremely easy using ES2016's bind syntax.
const promises = [
Promise.resolve('foo'),
Promise.resolve('bar')
]
promises::all().then((values) => {
console.log(values)
})
// → [ 'foo', 'bar' ]
If you are still an older version of ECMAScript, fear not: simply pass
the promise (or promises) as the first argument of the .call()
method:
var promises = [
Promise.resolve('foo'),
Promise.resolve('bar')
]
all.call(promises).then(function (values) {
console.log(values)
})
// → [ 'foo', 'bar' ]
Waits for all promises of a collection to be resolved.
Contrary to the standard
Promise.all(), this function works also with objects.
import { all } from 'promise-toolbox'
[
Promise.resolve('foo'),
Promise.resolve('bar')
]::all().then((value) => {
console.log(value)
// → ['foo', 'bar']
})
{
foo: Promise.resolve('foo'),
bar: Promise.resolve('bar')
}::all().then((value) => {
console.log(value)
// → {
// foo: 'foo',
// bar: 'bar'
// }
})
Register a node-style callback on this promise.
import { asCallback } from 'promise-toolbox'
// This function can be used either with node-style callbacks or with
// promises.
function getDataFor (input, callback) {
return dataFromDataBase(input)::asCallback(callback)
}
Similar to
Promise#catch()but:
- support predicates
- do not catch
ReferenceError,SyntaxErrororTypeErrorunless they match a predicate because they are usually programmer errors and should be handled separately.
somePromise.then(() => {
return a.b.c.d()
})::catchPlus(TypeError, ReferenceError, (reason) => {
// Will end up here on programmer error
})::catchPlus(NetworkError, TimeoutError, (reason) => {
// Will end up here on expected everyday network errors
})::catchPlus((reason) => {
// Catch any unexpected errors
})
Delays the resolution of a promise by
msmilliseconds.Note: the rejection is not delayed.
console.log(await Promise.resolve('500ms passed')::delay(500))
// → 500 ms passed
Also works with a value:
console.log(await delay.call('500ms passed', 500))
// → 500 ms passed
Iterates in order over a collection of promises waiting for each of them to be resolved.
[
Promise.resolve('foo'),
Promise.resolve('bar'),
]::forEach((value) => {
console.log(value)
})
// →
// foo
// bar
Execute a handler regardless of the promise fate. Similar to the
finallyblock in synchronous codes.The resolution value or rejection reason of the initial promise if forwarded.
import { lastly } from 'promise-toolbox'
function ajaxGetAsync (url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest
xhr.addEventListener('error', reject)
xhr.addEventListener('load', resolve)
xhr.open('GET', url)
xhr.send(null)
})::lastly(() => {
$('#ajax-loader-animation').hide()
})
}
Creates async functions taking node-style callbacks, create new ones returning promises.
import fs from 'fs'
import { promisify, promisifyAll } from 'promise-toolbox'
// Promisify a single function.
//
// If possible, the function name is kept and the new length is set.
const readFile = fs.readFile::promisify()
// Or all functions (own or inherited) exposed on a object.
const fsPromise = fs::promisifyAll()
readFile(__filename).then((content) => console.log(content))
fsPromise.readFile(__filename).then((content) => console.log(content))
Returns a promise which resolves to an objects which reflects the resolution of this promise.
import { reflect } from 'promise-toolbox'
const inspection = await promise::reflect()
if (inspection.isFulfilled()) {
console.log(inspection.value())
} else {
console.error(inspection.reason())
}
Waits for
countpromises in a collection to be resolved.
import { some } from 'promise-toolbox'
const [ first, seconds ] = await [
ping('ns1.example.org'),
ping('ns2.example.org'),
ping('ns3.example.org'),
ping('ns4.example.org')
]::some(2)
Automatically rejects a promise if it is still pending after
msmilliseconds.
import { timeout } from 'promise-toolbox'
await doLongOperation()::timeout(100)
> npm install
The sources files are watched and automatically recompiled on changes.
> npm run dev
> npm run test-dev
Contributions are very welcomed, either on the documentation or on the code.
You may:
ISC © Julien Fontanet
FAQs
Essential utils for promises
The npm package promise-toolbox receives a total of 138,259 weekly downloads. As such, promise-toolbox popularity was classified as popular.
We found that promise-toolbox demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
OWASP’s 2025 Top 10 introduces Software Supply Chain Failures as a new category, reflecting rising concern over dependency and build system risks.

Research
/Security News
Socket researchers discovered nine malicious NuGet packages that use time-delayed payloads to crash applications and corrupt industrial control systems.

Security News
Socket CTO Ahmad Nassri discusses why supply chain attacks now target developer machines and what AI means for the future of enterprise security.