https://github.com/baethon/promise-duck
If it `then()` like a promise it is a promise.
https://github.com/baethon/promise-duck
Last synced: 11 days ago
JSON representation
If it `then()` like a promise it is a promise.
- Host: GitHub
- URL: https://github.com/baethon/promise-duck
- Owner: baethon
- License: mit
- Created: 2018-01-07T10:48:30.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2018-01-10T10:55:57.000Z (over 8 years ago)
- Last Synced: 2025-10-30T00:55:02.237Z (9 months ago)
- Language: JavaScript
- Size: 27.3 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
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](https://github.com/folktale/data.task)
- [why?](#why)
- [installation](#installation)
- [usage](#usage)
- [development](#development)
## 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:
```js
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.
```js
// 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 query
```
## installation
```
npm i @baethon/promise-duck
# or with yarn
yarn add @baethon/promise-duck
```
## usage
Package exposes two functions:
1. `thenable()` converts given function to `Thenable` object.
1. `bind()` converts given function and binds it to the selected object
### thenable()
```js
const { thenable } = require('@baethon/promise-duck')
const heavyStuff = Math.random
const p = thenable(heavyStuff)
const result = await p
```
### bind()
```js
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:
```js
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](https://standardjs.com/); 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