@watch-state/async
Getting async data with watch-state.
Installation
npm
npm i @watch-state/async
yarn
yarn add @watch-state/async
Using
Async is a Promise like class.
Async constructor expects the first required argument as an async function and the second optional one as a default value.
import Async from '@watch-state/async'
const promise = new Async(() => fetch('/test'))
then, catch, finally
then, catch and finally always return an instance of Promise
const test = new Async(async () => {}).then() instanceof Promise
// test === true
Use then, catch and finally like on Promise
const promise = new Async(async () => 1)
promise
.then(value => console.log('then', value))
.finally(value => console.log('finally', value))
.catch(value => console.log('catch', value))
loading
You may check status of Async with loading, it's true when data is loading
const promise = new Async(async () => {})
// promise.loading === true
await promise
// promise.loading === false
This is observable field, you can use Watch to observe it.
const promise = new Async(async () => {})
new Wathc(() => {
console.log(promise.loading)
})
// true
await promise
// false
You can use the same way to watch on
loaded,value,error
loaded
You may check status of Async with loaded, it's true when data was loaded at least one time
const promise = new Async(async () => {})
// promise.loaded === false
await promise
// promise.loaded === true
value
You may get current result by value field
const promise = new Async(async () => 1)
// promise.value === undefined
await promise
// promise.value === 1
error
You may handle error by error field
const promise = new Async(() => Promise.reject(1))
new Watch(() => {
console.log(promise.error)
})
// > undefined
// > 1
update
Unlike Promise, you may reuse Async with update method
let i = 0
const promise = new Async(async () => i++)
console.log(await promise)
// > 0
// i === 1
promise.update()
console.log(await promise)
// > 1
// i === 2
You can set timeout to make update only after some time.
let i = 0
const promise = new Async(async () => i++)
console.log(await promise)
// > 0
// i === 1
promise.update(1000)
// nothing happends
await promise
// nothing happends
await new Promise(resolve => setTimeout(resolve, 1000))
// nothing happends
// 1 second passed, if use 1000ms it triggers update
promise.update(1000)
console.log(await promise)
// > 1
// i === 2
Issues
If you find a bug, please file an issue on GitHub