Socket
Socket
Sign inDemoInstall

thunky

Package Overview
Dependencies
0
Maintainers
2
Versions
6
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    thunky

delay the evaluation of a paramless async function and cache the result


Version published
Weekly downloads
11M
increased by0.84%
Maintainers
2
Install size
8.33 kB
Created
Weekly downloads
 

Package description

What is thunky?

The thunky npm package is designed to delay a function's execution until it's actually needed. It wraps a function in a way that ensures it is only called once, regardless of how many times the wrapper is invoked. This is particularly useful for initialization functions that you don't want to run multiple times or expensive operations that should be deferred until absolutely necessary.

What are thunky's main functionalities?

Lazy initialization

This feature allows for the lazy initialization of resources. The provided code sample demonstrates how a potentially expensive operation (simulated with a setTimeout) is wrapped in a thunky function. Despite calling 'load' twice, the initialization code only runs once, and both calls receive the result once it's available.

const thunky = require('thunky');
let load = thunky((callback) => {
  console.log('Initializing...');
  setTimeout(() => callback(null, 'Initialization complete'), 1000);
});

load((err, message) => console.log(message));
load((err, message) => console.log(message));

Other packages similar to thunky

Readme

Source

thunky

Delay the evaluation of a paramless async function and cache the result (see thunk).

npm install thunky

build status

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

Keywords

FAQs

Last updated on 14 Oct 2019

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc