Javascript 延迟()承诺和承诺之间的区别

Javascript 延迟()承诺和承诺之间的区别,javascript,promise,Javascript,Promise,我知道延迟将承诺状态控制和过程分开,这里以Q为例,由Q.defer().promise和Q.promise返回的承诺是完全不同的,为什么要这样设计?这两个“承诺”有什么区别 提前谢谢 附:我目前正在开发一个Promise库,欢迎发行和PRS:好的,这是关于Promise解析源的。Q和其他一些库提供了两个API: 传统的deferAPI——在该API中,您可以创建一个可.resolve(value)的deferred,并承诺可以返回 承诺构造函数-这是一种现代API,您可以在其中从完成源创建承诺

我知道延迟将承诺状态控制和过程分开,这里以Q为例,由
Q.defer().promise
Q.promise
返回的承诺是完全不同的,为什么要这样设计?这两个“承诺”有什么区别

提前谢谢


附:我目前正在开发一个Promise库,欢迎发行和PRS:

好的,这是关于Promise解析源的。Q和其他一些库提供了两个API:

  • 传统的
    defer
    API
    ——在该API中,您可以创建一个可
    .resolve(value)
    的deferred,并承诺可以返回
  • 承诺构造函数-这是一种现代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);});