@baethon/promise-duck
v1.0.1
Published
Converts object to be promise-like
Downloads
3
Readme
promise-duck
Converts given callback to Thenable
object.
Such object is compatible with Promise spec so it can be used as it was a real Promise.
The difference is that computation is deferred until then()
method is called or await
keyword is used.
It's quite fair to say that in the way how it works such Promise is quite similar to Task
why?
The idea came from little support library which was responsible for building a query (using sort-of fluent API) which was responsible for checking if given value is unique in the database.
I was wondering if object with then()
method can be used as a regular Promise. Turned out that its possible.
This little discovery opened me a way to define friendly syntax:
const emailUnique = await isUnique.in('users').where({ email: '[email protected]' })
The defined object can be stored in a variable and none query will be executed until calling then()
or using await
keyword.
// define details of query (no query is executed!)
const query = isUnique.in('users').where({ email: '[email protected]' })
// query the database and return the results
const emailUnique = await query
installation
npm i @baethon/promise-duck
# or with yarn
yarn add @baethon/promise-duck
usage
Package exposes two functions:
thenable()
converts given function toThenable
object.bind()
converts given function and binds it to the selected object
thenable()
const { thenable } = require('@baethon/promise-duck')
const heavyStuff = Math.random
const p = thenable(heavyStuff)
const result = await p
bind()
const { bind } = require('@baethon/promise-duck')
const heavyStuff = function () {
return `Hello ${this.name}`
}
const object = { name: 'Jon' }
bind(heavyStuff).to(object)
const result = await object
results cache
By default results generated by given function will be cached.
Both, thenable()
and bind()
allow to disable cache by passing memoize: false
option:
const { thenable } = require('@baethon/promise-duck')
const fn = Math.random
const p = thenable(fn, { memoize: false })
development
If you're planning to contribute to the package please make sure to adhere to following conventions.
tests & linting
- lint your code using standard; run
npm run lint
to check if there are any linting errors - make sure to write tests for all the changes/bug fixes
issues & PR
- try to provide regression test when you find a bug
- share some context on what you are trying to do, with enough code to reproduce the issue