我知道defer把promise状态控制和处理分开了,这里以Q为例,返回的promiseQ.defer().promise和promiseQ.Promise完全不同,为什么要这样设计呢?这两个“Promise”有什么区别
提前致谢
PS:我目前正在开发一个 Promise 库,欢迎使用问题和 PRS:https : //github.com/jiananshi/Promise-polyfill
我知道defer把promise状态控制和处理分开了,这里以Q为例,返回的promiseQ.defer().promise和promiseQ.Promise完全不同,为什么要这样设计呢?这两个“Promise”有什么区别
提前致谢
PS:我目前正在开发一个 Promise 库,欢迎使用问题和 PRS:https : //github.com/jiananshi/Promise-polyfill
嗯,这就是关于promise解析源。Q 和一堆其他库提供了两个 API:
deferAPI - 您可以在其中创建一个延迟,.resolve(value) 并且它有一个可以返回的Promise。大致做:
var d = Q.defer();
setTimeout(function(){ d.resolve(); }, 1000);
return d.promise;
是相同的:
return new Promise(function(resolve, reject){
setTimeout(resolve, 1000);
});
所以你可能会问
好吧,延迟 API 是第一位的。这是其他一些语言如何处理它,这是论文如何处理它以及人们首先如何使用它 - 但是 - 这两种 API 之间存在重要区别。Promise构造函数是安全的。
Promise 抽象异常处理并且是安全抛出的。如果您在Promise链中抛出,它将将该异常转换为拒绝,引用规范:
如果 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); });
}
}
现在,让我们看看 Promise 构造函数版本:
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);
}
在底部版本中 - Promise构造函数会将throws转换为拒绝,所以它足以做:
return get().then(function(e){
return handleException(e);
});
防止一整类程序员错误的发生。