我知道延迟分离承诺状态控制和处理,这里使用Q作为示例,Q.defer().promise
和Q.Promise
返回的承诺完全不同,为什么要以这种方式进行设计?这两个“承诺”之间有什么区别
提前致谢
PS:我目前正在研究Promise库,欢迎使用issws和PRS:https://github.com/jiananshi/Promise-polyfill
答案 0 :(得分:29)
嗯,这是关于承诺解决方案的来源。 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之间存在重要差异。 promise构造函数是安全的。
承诺抽象异常处理并且是安全的。如果你扔进一个承诺链,它会将该异常转换为拒绝,引用规范:
如果onFulfilled或onRejected引发异常e,则必须以e作为原因拒绝promise2
让我们假设您正在从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);
}
在底部版本中 - 承诺构造函数会将throw
转换为拒绝,因此它就足够了:
return get().then(function(e){
return handleException(e);
});
防止一整类程序员错误发生。