只要是写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日,如果它改进了就当我啥都没说)