我知道推迟中隔离失信状态控制和过程,在这里用品质为例,通过返回的承诺Q.defer().promise
和Q.Promise
是完全不同的,为什么这样设计? 什么是这两个“无极”的区别
提前致谢
PS:我目前工作的一个承诺库,issuses和PRS欢迎: https://github.com/jiananshi/Promise-polyfill
我知道推迟中隔离失信状态控制和过程,在这里用品质为例,通过返回的承诺Q.defer().promise
和Q.Promise
是完全不同的,为什么这样设计? 什么是这两个“无极”的区别
提前致谢
PS:我目前工作的一个承诺库,issuses和PRS欢迎: https://github.com/jiananshi/Promise-polyfill
那么,这是关于承诺分辨率源。 Q和一堆其他图书馆提供两种API:
defer
API -在你创建一个延迟,你可以.resolve(value)
,它有可以退货的承诺。 粗略地做:
var d = Q.defer();
setTimeout(function(){ d.resolve(); }, 1000);
return d.promise;
是相同的:
return new Promise(function(resolve, reject){
setTimeout(resolve, 1000);
});
所以你可能会问
那么,延迟API来了第一位。 这是一些其他语言如何处理它,它的文件如何处理它,这是人们首次使用它 - 但是 - 有两种API之间的重要区别。 该承诺的构造函数抛出安全。
承诺抽象的异常处理,并抛出安全。 如果你把一个承诺链里面它会是例外转换成拒绝,引用规范:
如果任一onFulfilled或onRejected抛出一个异常E,promise2必须随e为理由被拒绝
让我们假设你从XHR请求解析JSON:
function get(){
var d = Q.defer();
if(cached) { // use cached version user edited in localStorage
d.resolve(JSON.parse(cached));
} else { // get from server
myCallbackApi('/foo', function(res){ d.resolve(res); });
}
}
现在,让我们来看看诺构造的版本:
function get(){
return new Promise(function(resolve, reject){
if(cached) { // use cached version user edited in localStorage
resolve(JSON.parse(cached));
} else { // get from server
myCallbackApi('/foo', resolve);
}
});
}
现在,假设你不知何故服务器发送您无效JSON(或用户编辑它为无效状态),你缓存它。
在延迟版本 - 它同步抛出。 所以,你必须普遍防范它。 在底部的版本没有。 顶配版本的使用将如下所示:
try{
return get().catch(function(e){
return handleException(e); // can also just pass as function
});
} catch(e){
handleException(e);
}
在底部的版本-承诺构造函数将转换throw
s到拒绝,这样它就足够做:
return get().then(function(e){
return handleException(e);
});
从以往发生的防止全班编程错误。