@baethon/promise-duck v1.0.1
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: 'jon@winterfell.com' })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: 'jon@winterfell.com' })
// query the database and return the results
const emailUnique = await queryinstallation
npm i @baethon/promise-duck
# or with yarn
yarn add @baethon/promise-duckusage
Package exposes two functions:
thenable()converts given function toThenableobject.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 pbind()
const { bind } = require('@baethon/promise-duck')
const heavyStuff = function () {
return `Hello ${this.name}`
}
const object = { name: 'Jon' }
bind(heavyStuff).to(object)
const result = await objectresults 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 lintto 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