blob: f6f3893f9edecdfbe0ae07f2e05633baccd39bd7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
'use strict';
import initialParams from './internal/initialParams';
/**
* Sets a time limit on an asynchronous function. If the function does not call
* its callback within the specified miliseconds, it will be called with a
* timeout error. The code property for the error object will be `'ETIMEDOUT'`.
*
* @name timeout
* @static
* @memberOf async
* @category Util
* @param {Function} function - The asynchronous function you want to set the
* time limit.
* @param {number} miliseconds - The specified time limit.
* @param {*} [info] - Any variable you want attached (`string`, `object`, etc)
* to timeout Error for more information..
* @returns {Function} Returns a wrapped function that can be used with any of
* the control flow functions.
* @example
*
* async.timeout(function(callback) {
* doAsyncTask(callback);
* }, 1000);
*/
export default function timeout(asyncFn, miliseconds, info) {
var originalCallback, timer;
var timedOut = false;
function injectedCallback() {
if (!timedOut) {
originalCallback.apply(null, arguments);
clearTimeout(timer);
}
}
function timeoutCallback() {
var name = asyncFn.name || 'anonymous';
var error = new Error('Callback function "' + name + '" timed out.');
error.code = 'ETIMEDOUT';
if (info) {
error.info = info;
}
timedOut = true;
originalCallback(error);
}
return initialParams(function (args, origCallback) {
originalCallback = origCallback;
// setup timer and call original function
timer = setTimeout(timeoutCallback, miliseconds);
asyncFn.apply(null, args.concat(injectedCallback));
});
}
|