微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

deferpromise和Promise之间的区别

如何解决deferpromise和Promise之间的区别

好吧,这是关于承诺解决方案源的。Q和其他许多库提供两个API:

  • 您可以在其中创建一个递延函数.resolve(value) 并承诺可以返回。
  • -这是现代API,您可以在其中从完成源创建Promise。

粗略地做:

var d = Q.defer();
setTimeout(function(){ d.resolve(); }, 1000); 
return d.promise;

是相同的:

return new Promise(function(resolve, reject){
   setTimeout(resolve, 1000);
});

所以你可能会问

为什么我们需要两个API?

好吧,延迟API是第一个。这是其他语言处理它的方式,论文是处理它的方式,也是人们首先使用它的方式- 但是,这两个API之间存在重要区别。Promise构造函数很安全。

投掷安全

承诺抽象异常处理,并且是安全的。如果将一个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);
}

底部版本中-promise构造函数会将throws 转换为拒绝,因此足以执行此操作:

return get().then(function(e){
   return handleException(e);
});

防止发生一整类程序员错误

解决方法

我知道defer分隔诺言状态的控制和过程,这里以Q为例,返回的诺言Q.defer().promiseQ.Promise完全不同,为什么这样设计?这两个“承诺”有什么区别

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。