javascript中使用promise的一个误区

只要是写javascript,就一定会用到promise来优化异步调用的代码。因为它把回调金字塔扁平化了,让代码好看一些了。


在浏览器中或nodejs中执行下面两段代码:

var p1 = new Promise(function(resolve, reject) {
  resolve('Success');
});

p1.then(function(value) {
  console.log(value);
  return value;
}).then(function(value) {
  console.log(value);
  throw 'oh, no!';    //异常
}).catch(function(e) {
  console.log(e);
});

//结果
//Success
//Success
//oh, no!
var p1 = new Promise(function(resolve, reject) {
  resolve('Success');
});

p1.then(function(value) {
  console.log(value);
  throw 'oh, no!';    //异常
  return value;
}).then(function(value) {
  console.log(value);
}).catch(function(e) {
  console.log(e);
});

//结果
//Success
//oh, no!

两段代码唯一不同的地方就是出现异常的地方。细心的读者可能已经发现,我要说的是,如果promise过程出现了任何异常,离异常最近的一处catch的回调会立刻被调用。


我之前写promise的代码都是这样的:

doStaff().then(success, fail)

这样的写法或多或少只是把回调的金字塔改成回调的大厦了。而且很多时候我都忘记写出错时的回调,这会导致所有的错误都被“吞掉”了。


现在我把代码改成这样:

doStaff()
  .then(success)
  .catch(fail)

这样不仅会提高代码可读性,也保证我在正确使用promise——解决异步编程中拦截异常的困难。

植入广告,防止转载:Lemonce Alpha2 发布内测,内测地址:http://www.lemonce.net

这也是大家都说,jquery哪里都好,但他的deffered(promise)的API的设计是错误的原因。因为大家都写$.deffered.then(success),错误和请求进度的回调不写了,于是错误被“吞掉”。

(我最后一次看jquery的源码是2016年1月12日,如果它改进了就当我啥都没说)

转载于:https://my.oschina.net/u/2315002/blog/601560

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值