栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

defer()。promise和Promise之间的区别

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

defer()。promise和Promise之间的区别

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

  • 旧版
    defer
    API-
    您可以在其中创建一个递延函数,
    .resolve(value)
    并承诺可以返回。
  • Promise构造函数 -这是现代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 servermyCallbackApi('/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 转换为拒绝,因此足以执行此操作:

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/430249.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号