共计 1443 个字符,预计需要花费 4 分钟才能阅读完成。
Promisification
是一个很长的词,示意一个编程范式的转变,行将承受回调的函数转换为一个返回类型为 Promise 的函数。
咱们事实的开发我的项目中常常须要这种转换,因为许多函数和库都是基于回调的,然而 Promise 更不便,所以对它们进行 Promisification 解决是有意义的。
上面是一个简略的例子。
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);
}
这段代码,动态创建一个 script 元素,待其加载结束后,会触发 onload 事件指定的回调函数。
运行时,loadScript 的调用者,负责指定回调函数:
loadScript('path/script.js', (err, script) => {...})
上面咱们将会对这个函数进行 Promisification 革新。
咱们将创立一个新函数 loadScriptPromise(src),它执行雷同的操作(加载脚本),但返回一个 Promise 而不是应用回调。
换句话说,咱们只传递 src(没有回调)并失去一个 Promise 作为返回参数,当加载胜利时应用创立并加载好的 script 进行 resolve,否则通过 reject 抛出谬误。
革新后的函数:
let loadScriptPromise = function(src) {return new Promise((resolve, reject) => {loadScript(src, (err, script) => {if (err) reject(err);
else resolve(script);
});
});
};
生产代码:
loadScriptPromise('path/script.js').then(...)
正如咱们所见,新函数是原始 loadScript 函数的包装器。
在实践中,咱们可能须要 Promisify 多个函数,所以结构一个 helper 函数显得更有意义。
咱们称这个函数为 promisify(f):它承受一个筹备被革新成 Promise 的函数 f,并返回一个 wrapper 函数。
残缺实现如下:
function promisify(f) {return function (...args) {// return a wrapper-function (*)
return new Promise((resolve, reject) => {function callback(err, result) {// our custom callback for f (**)
if (err) {reject(err);
} else {resolve(result);
}
}
args.push(callback); // append our custom callback to the end of f arguments
f.call(this, ...args); // call the original function
});
};
}
生产代码:
let loadScriptPromise = promisify(loadScript);
loadScriptPromise(...).then(...);
正文完
发表至: javascript
2022-08-15