|
"use strict"; |
|
module.exports = asPromise; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function asPromise(fn, ctx) { |
|
var params = new Array(arguments.length - 1), |
|
offset = 0, |
|
index = 2, |
|
pending = true; |
|
while (index < arguments.length) |
|
params[offset++] = arguments[index++]; |
|
return new Promise(function executor(resolve, reject) { |
|
params[offset] = function callback(err) { |
|
if (pending) { |
|
pending = false; |
|
if (err) |
|
reject(err); |
|
else { |
|
var params = new Array(arguments.length - 1), |
|
offset = 0; |
|
while (offset < params.length) |
|
params[offset++] = arguments[offset]; |
|
resolve.apply(null, params); |
|
} |
|
} |
|
}; |
|
try { |
|
fn.apply(ctx || null, params); |
|
} catch (err) { |
|
if (pending) { |
|
pending = false; |
|
reject(err); |
|
} |
|
} |
|
}); |
|
} |
|
|