6.1.4 • Published 5 months ago

p-timeout v6.1.4

Weekly downloads
11,248,826
License
MIT
Repository
github
Last release
5 months ago

p-timeout

Timeout a promise after a specified amount of time

!NOTE You may want to use AbortSignal.timeout() instead. Learn more.

Install

npm install p-timeout

Usage

import {setTimeout} from 'node:timers/promises';
import pTimeout from 'p-timeout';

const delayedPromise = setTimeout(200);

await pTimeout(delayedPromise, {
	milliseconds: 50,
});
//=> [TimeoutError: Promise timed out after 50 milliseconds]

API

pTimeout(input, options)

Returns a decorated input that times out after milliseconds time. It has a .clear() method that clears the timeout.

If you pass in a cancelable promise, specifically a promise with a .cancel() method, that method will be called when the pTimeout promise times out.

input

Type: Promise

Promise to decorate.

options

Type: object

milliseconds

Type: number

Milliseconds before timing out.

Passing Infinity will cause it to never time out.

message

Type: string | Error | false\ Default: 'Promise timed out after 50 milliseconds'

Specify a custom error message or error to throw when it times out:

  • message: 'too slow' will throw TimeoutError('too slow')
  • message: new MyCustomError('it’s over 9000') will throw the same error instance
  • message: false will make the promise resolve with undefined instead of rejecting

If you do a custom error, it's recommended to sub-class TimeoutError:

import {TimeoutError} from 'p-timeout';

class MyCustomError extends TimeoutError {
	name = "MyCustomError";
}
fallback

Type: Function

Do something other than rejecting with an error on timeout.

You could for example retry:

import {setTimeout} from 'node:timers/promises';
import pTimeout from 'p-timeout';

const delayedPromise = () => setTimeout(200);

await pTimeout(delayedPromise(), {
	milliseconds: 50,
	fallback: () => {
		return pTimeout(delayedPromise(), {milliseconds: 300});
	},
});
customTimers

Type: object with function properties setTimeout and clearTimeout

Custom implementations for the setTimeout and clearTimeout functions.

Useful for testing purposes, in particular to work around sinon.useFakeTimers().

Example:

import {setTimeout} from 'node:timers/promises';
import pTimeout from 'p-timeout';

const originalSetTimeout = setTimeout;
const originalClearTimeout = clearTimeout;

sinon.useFakeTimers();

// Use `pTimeout` without being affected by `sinon.useFakeTimers()`:
await pTimeout(doSomething(), {
	milliseconds: 2000,
	customTimers: {
		setTimeout: originalSetTimeout,
		clearTimeout: originalClearTimeout
	}
});

signal

Type: AbortSignal

You can abort the promise using AbortController.

Requires Node.js 16 or later.

import pTimeout from 'p-timeout';
import delay from 'delay';

const delayedPromise = delay(3000);

const abortController = new AbortController();

setTimeout(() => {
	abortController.abort();
}, 100);

await pTimeout(delayedPromise, {
	milliseconds: 2000,
	signal: abortController.signal
});

TimeoutError

Exposed for instance checking and sub-classing.

Related

  • delay - Delay a promise a specified amount of time
  • p-min-delay - Delay a promise a minimum amount of time
  • p-retry - Retry a promise-returning function
  • More…

AbortSignal

Modern alternative to p-timeout

Asynchronous functions like fetch can accept an AbortSignal, which can be conveniently created with AbortSignal.timeout().

The advantage over p-timeout is that the promise-generating function (like fetch) is actually notified that the user is no longer expecting an answer, so it can interrupt its work and free resources.

// Call API, timeout after 5 seconds
const response = await fetch('./my-api', {signal: AbortSignal.timeout(5000)});
async function buildWall(signal) {
	for (const brick of bricks) {
		signal.throwIfAborted();
		// Or: if (signal.aborted) { return; }

		await layBrick();
	}
}

// Stop long work after 60 seconds
await buildWall(AbortSignal.timeout(60_000))

You can also combine multiple signals, like when you have a timeout and an AbortController triggered with a “Cancel” button click. You can use the upcoming AbortSignal.any() helper or abort-utils.

p-eventp-queue@braum-ai/sdkcomponennentt@chat-bots/goatchat-apivuedragdropuploadimagescad-cligohiei-bull@shipengine/cli@shipengine/integration-platform-cli@skylar745/3box@mc3-aether/aetherniouz-apilumerin-wallet-corettio@olivervorasai/slidercogoportutilsdyx-reacttalent-to-vite-cliunblock-block-save-variables@saaspe/components@leonzalion/p-wait-for@pixiebrix/extensionexpand-react-bridgeopea-bootstraap@everything-registry/sub-chunk-2396custom-gpt-userp149-tabletest-popupstuyapi-newgentangdy_chatgptwinx-form-winxwolfy-sdkweb-elements-iconsvue-button-test1web3-script-sdkwebchewxioxdlsatoru-sdktelegraftelegraf-fixed-sessiontelegraf-axiostelegram-test-apistories-react-bdsparkai-jssparkaiv2-jssparkaiv3-jssparkaiv4-jssparkaiv5-jssparkaiv6-jssparkaiv7-jssvelte-component-libtethrvlopp-p-queuevandelayvercel-node-devvs-tree-plus@dplusic/gamelift-nodejs-serversdk@dimcheify/dimui@cloudquery/plugin-sdk-javascript@compensa/chatgpt@companion-module/base@cumulus/aws-client@comapeo/core@cybermega/flutter-resource-manager-rs@corellium/corellium-api@daiki48/keisan@dinert/component@diia-inhouse/diia-queue@demirdeniz/tuyapi-newgen@borealisswap/borealis-swap-lib@blkmarketco/components-library@positionex/position-sdk@rbxdiscord/chatcauseway-concrete-stylesjaidbotipfs-interopjeuxuijson-categorizeipfs-versidagis-onlineis-reachableis-reachable-rk4-base-bridgekahnlamed_asyncladder-sdk-bateladder-sdk-betaladder-sdk-dev@yhostc/chatbot-puppetbaleh_telegrafsushi-sdk-ftm@purnasatria/directus-extension-document-interfacezzzxxxyyy321123sparkaiv8-jsty-sdktype-libarytwitch-jsud7-act2
6.1.4

5 months ago

6.1.3

8 months ago

6.1.2

2 years ago

6.1.0

2 years ago

6.1.1

2 years ago

5.1.0

3 years ago

6.0.0

3 years ago

5.0.2

4 years ago

5.0.1

4 years ago

5.0.0

4 years ago

4.1.0

4 years ago

4.0.1

5 years ago

4.0.0

5 years ago

3.2.0

6 years ago

3.1.0

6 years ago

3.0.0

6 years ago

2.0.1

8 years ago

2.0.0

8 years ago

1.2.1

8 years ago

1.2.0

8 years ago

1.1.1

8 years ago

1.1.0

8 years ago

1.0.0

9 years ago