An open API service indexing awesome lists of open source software.

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.

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