Promise的使用动机

(注:英文原文链接是这个)
看一下下面的读取文件并把它转化成JSON对象的同步js代码,它看起来可读性很好,但是你并不会想要使用它因为它是阻塞的,这意味着当你读取文件的时候你不能让代码做其他事

   function readJSONSync(filename){
       return JSON.parse(fs.readFileSync(filename, 'utf-8'));
   }

为了使我们的代码更高效并且更有弹性,我们应该让涉及IO读写操作(或者说一个费时操作)变成异步的。最容易的方法是使用一个callback回调。一个幼稚的实现也许会让它出错:

   function readJSON(filename, callback){
       fs.readFile(filename, 'utf-8', function(err, res){
           if(err) return callback(err);
           callback(null, JSON.parse(res));
       })
   }
  • 这个额外的参数callback可能让我们对哪个是input、哪个是返回值感到困惑
  • It doesn’t work at all with control flow primitives.
  • 它并不能处理由JSON.parse抛出的错误
    所以我们需要一个能捕获JSON.parse抛出错误但又不能不小心将callback错误也捕获的函数。目前为止我们想出了下面的代码
   function readJSON(filename, callback){
       fs.readFile(filename, 'utf-8', function(err, res){
           if(err) return callback(err);
           try{
              res = JSON.parse(res);
           } catch(ex){
              return callback(ex);
           }
           callback(null, res);
       })
   }

错误处理代码混论不说,我们始终没有解决多了一个额外的参数callback的问题,Promise帮助你能简单地处理错误,并且写非常整洁的没有callback的代码。关于Promise可以参考另一篇博文详解Promise对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值