add timeout support for async function
npm install promise.timeout> add timeout support for async function





``sh`
$ pnpm add promise.timeout
- this module targets ES5 environment.
- this module require global AbortController, Node.js has builtin global since v15
`js`
var ptimeout = require('promise.timeout')
ptimeout(fn, timeout)
- fn the async functiontimeout
- in ms
`js
var ptimeout = require('promise.timeout')
// a function will cost 20ms
function test() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(20)
}, 20)
})
}
var test10 = ptimeout(test, 10)
var test50 = ptimeout(test, 50)
// 10 timeout
try {
await test10()
} catch (e) {
e.should.be.ok()
e.should.be.instanceof(ptimeout.TimeoutError)
e.message.should.match(/timeout/)
e.timeout.should.equal(10)
}
// 50 ok
var _50 = await test50()
_50.should.be.ok()
_50.should.equal(20)
`
ptimeout will provide an extra runtime argument signal: AbortSignal, you can use the signal to register abort action.
when timeout reached, the abort action will be executed
`js
var ptimeout = require('promise.timeout')
// a function will cost 20ms
function test(signal) {
return new Promise(function (resolve, reject) {
var timer = setTimeout(function () {
resolve(20)
}, 20)
// clean up
signal.addEventListener('abort', () => {
clearTimeout(timer)
})
})
}
var test10 = ptimeout(test, 10)
try {
await test10()
} catch (e) {
e.should.ok()
}
`
- easy to type, easy to strip signal argument, easy to use with TypeScript
- AND it's shiped in Node.js https://nodejs.org/api/globals.html#class-abortcontroller
- for browser, users should consider a polyfill for AbortController & AbortSignal if not provided nativly
old version use onCancel
to register clean up action
with AbortController you need to
`jsnormalFn
function normalFn(a, r, g, s, controller: AbortController) {
controller.signal.addEventListener('abort', () => {
// cancel operations that starts in body`
})
}
- and ptimeout will call the controller.abort() if any timeout exceedsonCancel`, you provide a cancel operation to ptimeout, ptimeout will call that
- and with
That's the same, and I don't want to depend on an extra package abort-controller
- promise.timeout
- promise.retry
- promise.map
- promise.ify
- promise.cb
- promise.obj
- promise.sleep
the MIT License http://magicdawn.mit-license.org