包装函数
function pmsify(fun) {
return function (...arg) {
return new Promise((resolve, reject) => {
if (arg.length >= fun.length - 1) {
fun(...arg, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
}
});
};
}
说明
- 每个异步函数都要是单任务的,内部不要再包含其他异步的任务。
- 回调函数使用nodejs的规范,为callback(err, data)。
只能向后传递一个参数data(可以是对象、数组等结构化的参数)。 - 在每个异步函数出口的地方写回调。
实例代码
const fs = require("fs");
let fr = pmsify(fs.readFile); //包装nodejs异步函数
fr("./1.txt", "utf8")
.then((data) => {
console.log("step1");
console.log(data);
})
.then(() => {
return fr("./2.txt", "utf8");
})
.then((data) => {
console.log("step2");
console.log(data);
})
.then(() => {
return fr("./3.txt", "utf8");
})
.then((data) => {
console.log("step3");
console.log(data);
})
.catch((err) => {
console.log(err);
});
输出,
step1
this is 1.txt.
step2
this is 2.txt.
step3
this is 3.txt.
如果出错,也可以捕捉到,
step1
this is 1.txt.
step2
this is 2.txt.
[Error: ENOENT: no such file or directory, open 'C:\33.txt'] {
errno: -4058,
code: 'ENOENT',C
syscall: 'open',
path: 'C:\\33.txt'
}
优化
- 对函数的实参数量不要求,只保证最后一个参数是回调函数。
function pmsify(fun) {
return function (...arg) {
return new Promise((resolve, reject) => {
arg.length = fun.length - 1; //last parameter is callback function.
fun(...arg, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
};
}