# 概述收集一些常见的前端手撕题
# 转换回调函数为 Promise 函数 # 描述编写一个函数,接受另一个函数 fn ,并将基于回调函数的函数转换为基于 Promise 的函数
一个可以传递给 promisify 的函数示例
1 2 3 4 5 6 7 8 function sum(callback, a, b) { if (a < 0 || b < 0) { const err = Error('a and b must be positive'); callback(undefined, err); } else { callback(a + b); } }
# 代码骨架1 2 3 4 5 6 7 8 9 10 11 12 13 /** * @param {Function} fn * @return {Function<Promise<number>>} */ var promisify = function(fn) { return async function(...args) { } }; /** * const asyncFunc = promisify(callback => callback(42)); * asyncFunc().then(console.log); // 42 */
# 思路fn 函数的第一个参数是 callback 回调,callback 接受 data 和 error 在 callback 里面根据 data 和 error 调用 resolve 或者 reject # 解决方案1 2 3 4 5 6 7 8 9 10 11 12 13 var promisify = function (fn) { return async function (...args) { return new Promise((resolve, reject) => { fn( (data, error) => { if (error) reject(error) else resolve(data) }, ...args, ) }) } };