# 概述

收集一些常见的前端手撕题

# 转换回调函数为 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
*/

# 思路

  1. fn 函数的第一个参数是 callback 回调,callback 接受 data 和 error
  2. 在 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,
)
})
}
};