Built motion from commit 6a09e18b.|2.6.11
[motion2.git] / legacy-libs / @protobufjs / aspromise / index.js
1 "use strict";\r
2 module.exports = asPromise;\r
3 \r
4 /**\r
5  * Callback as used by {@link util.asPromise}.\r
6  * @typedef asPromiseCallback\r
7  * @type {function}\r
8  * @param {Error|null} error Error, if any\r
9  * @param {...*} params Additional arguments\r
10  * @returns {undefined}\r
11  */\r
12 \r
13 /**\r
14  * Returns a promise from a node-style callback function.\r
15  * @memberof util\r
16  * @param {asPromiseCallback} fn Function to call\r
17  * @param {*} ctx Function context\r
18  * @param {...*} params Function arguments\r
19  * @returns {Promise<*>} Promisified function\r
20  */\r
21 function asPromise(fn, ctx/*, varargs */) {\r
22     var params  = new Array(arguments.length - 1),\r
23         offset  = 0,\r
24         index   = 2,\r
25         pending = true;\r
26     while (index < arguments.length)\r
27         params[offset++] = arguments[index++];\r
28     return new Promise(function executor(resolve, reject) {\r
29         params[offset] = function callback(err/*, varargs */) {\r
30             if (pending) {\r
31                 pending = false;\r
32                 if (err)\r
33                     reject(err);\r
34                 else {\r
35                     var params = new Array(arguments.length - 1),\r
36                         offset = 0;\r
37                     while (offset < params.length)\r
38                         params[offset++] = arguments[offset];\r
39                     resolve.apply(null, params);\r
40                 }\r
41             }\r
42         };\r
43         try {\r
44             fn.apply(ctx || null, params);\r
45         } catch (err) {\r
46             if (pending) {\r
47                 pending = false;\r
48                 reject(err);\r
49             }\r
50         }\r
51     });\r
52 }\r