nodejs中的所有异步api都是把最后一个参数作为回调函数。遇到一些开发习惯不好的程序员会把多重异步写成嵌套模式的回调,增加阅读和维护的难度。我觉得,这些api如果可以把回调的形式改成Promise就好了,这样能从根源上解决嵌套回调的作死行为。
nodejs的异步api结构通常是这样的:
function testAsync(arg1,arg2,callback){
// 一些过程
...
// 如果执行成功
callback(null,执行结果);
// 如果执行失败
callback(错误原因,null);
}
所以封装成Promise时,只需要对callback和callback的第一个参数做特殊对待即可,以下是一个简单的转换封装。
/**
* @param {Function} apiHandler , {Array} args for apiHandler , {Object} this
* @param {Object} [options.cookie] Options for cookie
*/
var ts=(handler,args,_this)=>{
return new Promise(function(resolve,reject){
(args=args||[]).push((e,...r)=>e?reject(e):resolve(r));
return handler.apply(_this || {},args);
});
};
使用示例如下,供实际使用参考。
//----------------------------------------
var ts=(handler,args,_this)=>{
return new Promise(function(resolve,reject){
(args=args||[]).push((e,...r)=>e?reject(e):resolve(r));
return handler.apply(_this || {},args);
});
};
//----------------------------------------
// 一个异步的 api
var r=function(a,callback){
console.log('> ',a);
setTimeout(()=>callback(null,{a:a}),500);
};
// 使用Promise形式的风格
ts(r,[1]).then(
(a)=>ts(r,[2])
).then(
(a)=>ts(r,[3])
).then(
(a)=>ts(r,[4])
).then(()=>console.log('done'));
// 回调嵌套模式
r(1,()=>{
r(2,()=>{
r(3,()=>{
r(4,()=>{
console.log('done');
});
});
});
});
相关文档
暂无
随便看看
畅言模块加载中