首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >角:$q.defer()与$q()

角:$q.defer()与$q()
EN

Stack Overflow用户
提问于 2016-03-14 14:14:39
回答 3查看 1.7K关注 0票数 4

在角度上,以下片段似乎是等价的:

代码语言:javascript
运行
复制
let deferred = $q.defer();
if(whatever) {
   deferred.resolve('something');
}
else {
   deferred.reject('nah');
}
return deferred.promise;

代码语言:javascript
运行
复制
return $q((resolve,reject) => {
    if(whatever) {
       resolve('something');
    }
    else {
       reject('nah');
    }
});

我的问题是:如果它们不是等价的,它们有什么区别?如果它们是等价的,那么是否有一个令人信服的理由来选择一个而另一个呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-14 14:23:27

您发布的第二个版本是许诺/A+-Specification后面的版本。

从功能的角度来看,这两个版本是等价的。第一个版本(在我看来)可以更容易地将异步代码理解为同步代码,但第二个版本使用的语法使其成为ES2015的一部分,也将成为ES6的一部分,也就是javascript的下一个版本。

因此,选择取决于您,但您可以期待看到更多的第二种类型的承诺-语法在未来。

票数 5
EN

Stack Overflow用户

发布于 2016-03-14 14:31:34

$q的承诺而言,两者之间并没有很大的行为差异。第二种方法的主要好处是它使用了与本机承诺相同的样式,并且很好地包含了解决承诺的逻辑,而不是让松散的延迟在周围徘徊(这可能是本机承诺与后者相同的原因之一)。

我错误地说,第二种方法将捕获传递的函数中的同步错误,并将它们转换为被拒绝的承诺。对于本地承诺、Q承诺、蓝鸟承诺以及可能的其他承诺,这是正确的,但对于$q()则不是这样。$q只会将错误视为未察觉的错误,并将其记录到控制台。

这里有一个例子,用蓝鸟的承诺,我刚才描述的。如果您使用的是$q以外的承诺,那么使用后一种风格是一个很好的理由。

代码语言:javascript
运行
复制
function queryValue(callback) {
  throw new Error("Not implemented yet!!!");
}

function makeConstructorPromise() {
  return new Promise(function(resolve) {
    queryValue(function(value) {
      resolve(value);
    });
  });
}

function makeDeferredPromise() {
  let deferred = Promise.defer();

  queryValue(function(value) {
    deferred.resolve(value);
  });

  return deferred.promise;
}

makeConstructorPromise()
  .catch(function(error) {
    console.error('caught the constructed promise error!', error);
  });

makeDeferredPromise()
  .catch(function(error) {
    // not caught
    console.error('caught the deferred promise error!', error);
  });
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.5.1/bluebird.min.js"></script>

延迟的方法是老式的,在非常具体的情况下可能有实际的应用,但是99%的时候,构造函数的方法是可行的。

它更安全(在大多数承诺的实现中),并且与ES6承诺的工作方式一致。

票数 3
EN

Stack Overflow用户

发布于 2016-03-14 14:33:34

功能是等价的-它更多的是关于“风格”。

其中一种语法更像Kris,它是javascript中最早实现承诺的方法之一。

另一种语法更像我们将在ES6中得到的实现。

所以,如果你开始学习的话,我建议你使用ES6的方式,因为这将是“标准javascript”的未来,而不仅仅是角度。

关于这个话题和你的问题的更多信息,你可以直接在安圭拉文档中找到:https://docs.angularjs.org/api/ng/service/$q/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35989893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档