Package Exports
- thunky
- thunky/promise
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (thunky) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
thunky
Delay the evaluation of a paramless async function and cache the result (see thunk).
npm install thunky
Example
Let's make a simple function that returns a random number 1 second after it is called for the first time
var thunky = require('thunky')
var test = thunky(function (callback) { // the inner function should only accept a callback
console.log('waiting 1s and returning random number')
setTimeout(function () {
callback(Math.random())
}, 1000)
})
test(function (num) { // inner function is called the first time we call test
console.log(num) // prints random number
})
test(function (num) { // subsequent calls waits for the first call to finish and return the same value
console.log(num) // prints the same random number as above
})
Lazy evaluation
Thunky makes it easy to implement a lazy evaluation pattern.
var getDb = thunky(function (callback) {
db.open(myConnectionString, callback)
})
var queryDb = function (query, callback) {
getDb(function (err, db) {
if (err) return callback(err)
db.query(query, callback)
})
}
queryDb('some query', function (err, result) { ... } )
queryDb('some other query', function (err, result) { ... } )
The first time getDb
is called it will try do open a connection to the database.
Any subsequent calls will just wait for the first call to complete and then call your callback.
A nice property of this pattern is that it easily allows us to pass any error caused by getDb
to the queryDb
callback.
Error → No caching
If the thunk callback is called with an Error
object as the first argument it will not cache the result
var fails = thunky(function (callback) {
console.log('returning an error')
callback(new Error('bad stuff'))
})
fails(function (err) { // inner function is called
console.log(err)
});
fails(function (err) { // inner function is called again as it returned an error before
console.log(err)
})
Promise version
A promise version is available as well
var thunkyp = require('thunky/promise')
var ready = thunkyp(async function () {
// ... do async stuff
return 42
})
// same semantics as the callback version
await ready()
License
MIT