- “Promisification” 指将一个接受回调的函数转换为一个返回 promise 的函数。
- 因为使用promise更加方便,所以将基于回调的函数和库 promisify 是有意义的
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(null, script);
script.onerror = () => callback(new Error(`Script load error for ${src}`));
document.head.append(script);
}
- 第一种方法
let loadScriptPromise = function(src) {
return new Promise((resolve, reject) => {
loadScript(src, (err, script) => {
if (err) reject(err);
else resolve(script);
});
});
};
- 第二种方法
function promisify(f) {
return function (...args) {
return new Promise((resolve, reject) => {
function callback(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
}
args.push(callback);
f.call(this, ...args);
});
};
}
let loadScriptPromise = promisify(loadScript);
loadScriptPromise(...).then(...);
- 如果原始的 f 期望一个带有更多参数的回调 callback(err, res1, res2, …)
function promisify(f, manyArgs = false) {
return function (...args) {
return new Promise((resolve, reject) => {
function callback(err, ...results) {
if (err) {
reject(err);
} else {
resolve(manyArgs ? results : results[0]);
}
}
args.push(callback);
f.call(this, ...args);
});
};
}
f = promisify(f, true);
f(...).then(arrayOfResults => ..., err => ...);