展开目录
callback => Promise.then
nodejspromisejavascript
X
陈尼玛的博客
记录开发生涯的踩坑经历,用时间来验证成长
加载中

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');
      });
    });
  });
});

相关文档

暂无

随便看看

  1. windows电脑防止自动休眠

  2. 记一次nodejs内存泄漏的排查经历

  3. cnpm 立即同步

  4. 安卓文字偏上,文字顶部被遮罩

  5. nodejs 长连接

  6. npm远程服务器某些配置不兼容代理的解决办法

  7. jxa运动指令脚本

  8. nodejs俄罗斯方块

  9. npm设置仓库地址和代理

  10. webrtc泄漏本地ip信息

  11. 单页应用的单向数据流的流程图

  12. 树莓派配置wifi热点

  13. 把树莓派的存储空间拓展到整张TF卡中

  14. mac搜索局域网内的主机

  15. centos7 开放或者关闭端口

  16. ie8上Image.onload不触发问题

  17. 随机取某个概率区间的代码

  18. 前端性能观察器

畅言模块加载中