Javascript 延迟()承诺和承诺之间的区别
我知道延迟将承诺状态控制和过程分开,这里以Q为例,由Javascript 延迟()承诺和承诺之间的区别,javascript,promise,Javascript,Promise,我知道延迟将承诺状态控制和过程分开,这里以Q为例,由Q.defer().promise和Q.promise返回的承诺是完全不同的,为什么要这样设计?这两个“承诺”有什么区别 提前谢谢 附:我目前正在开发一个Promise库,欢迎发行和PRS:好的,这是关于Promise解析源的。Q和其他一些库提供了两个API: 传统的deferAPI——在该API中,您可以创建一个可.resolve(value)的deferred,并承诺可以返回 承诺构造函数-这是一种现代API,您可以在其中从完成源创建承诺
Q.defer().promise
和Q.promise
返回的承诺是完全不同的,为什么要这样设计?这两个“承诺”有什么区别
提前谢谢
附:我目前正在开发一个Promise库,欢迎发行和PRS:好的,这是关于Promise解析源的。Q和其他一些库提供了两个API:
- 传统的
API——在该API中,您可以创建一个可defer
的deferred,并承诺可以返回.resolve(value)
- 承诺构造函数-这是一种现代API,您可以在其中从完成源创建承诺
var d = Q.defer();
setTimeout(function(){ d.resolve(); }, 1000);
return d.promise;
同:
return new Promise(function(resolve, reject){
setTimeout(resolve, 1000);
});
所以你可能会问
为什么我们需要两个API?
嗯,延迟API首先出现。这是一些其他语言如何处理它,这是论文如何处理它,这是人们如何首先使用它-然而-这两个API之间有一个重要的区别。承诺构造函数是安全的
投掷安全
承诺抽象异常处理和抛出安全。如果您在承诺链中抛出,它会将该异常转换为拒绝,引用规范:
如果OnCompleted或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构造函数将throw
s转换为rejections,这样就足够执行以下操作:
return get().then(function(e){
return handleException(e);
});
防止一整类程序员错误的发生。@Claies绝对不会,如果您已经阅读了questions@Claies我确实读过它,它和Defer做的事情完全一样,不知怎么的,我想称它为
糖方法
。让我们深入地看一下Q,Q.promise也会返回方法:<代码>解析< /COD>和<代码>拒绝<代码>,但它与ES6承诺略有不同,在这里它<代码>解析< /Cord>执行奇怪。我正在努力理解这个״的设计目的。defer“是旧API,“new Promise”是新API。新库只支持后者。原因是构造函数版本是throw-safe。@Claies它不是一个dupe…我不知道你为什么会认为它是。另请看这意味着,如果我们使用defer().promise,我们必须手动处理错误,否则它将弹出窗口。而在promise构造函数中,您不必担心它,这就是抛出的区别safety@klamtlne是的,这就是我所说的:)你可以在这里阅读更多关于基本原理的内容:而且,我发现很难理解为什么Q.promise不公开像然后
。如果目标是过程控制,则不应公开解决
和拒绝
@klamtlne新Q.Promise(…)
从创建源构造一个新的承诺。创建的对象是一个承诺,它确实有一个then
方法。另请参见:在最后一个代码片段中,您似乎正在处理then()
的成功回调中的异常。我肯定我没有理解什么,但不应该是这样:return get()。然后(函数{/*success*/},函数(e){returnHandleException(e);});