【问题标题】:Relation between .then and deferObj.resolve() of promise in angularjsangularjs中promise的.then和deferObj.resolve()之间的关系
【发布时间】:2016-09-25 15:58:54
【问题描述】:

我发现很难理解 angularjs 中的几个 promise 概念。我了解它是什么以及何时使用它,并且 $q.defer 创建了一个 promise 对象,该对象具有诸如 resolve()、reject() 之类的方法then 函数在某些情况下我们使用它,而在某些情况下我们不使用。

link1link2link3

我浏览了很多类似上面的链接,但仍然没有得到,也许我理解错了。但是任何人请解释何时将 .resolve 方法放入 .then 函数中,或者如果我的理解完全错误,请在投反对票之前纠正我,因为在将问题发布到此处之前确实尝试自己理解它。

【问题讨论】:

  • “解释何时将 .resolve 方法放入 .then 函数中” .then() 应遵循 .resolve()。您能否提供一个您在 Question 中尝试过的javascript 示例?
  • 当您希望调用函数知道承诺已实现时,通常将.resolve() 放在.then() 中
  • @Ladmerc 但在 $http 中我们只使用 .then 而不是其中的 resolve 方法。你能解释一下为什么吗?
  • 因为.then() 的$http 通常意味着您的承诺已经解决。当然,除非您有另一个承诺在.then() 内解决

标签: javascript angularjs angular-promise


【解决方案1】:

Promise 是一个可以传递或返回的对象,它持有对异步行为结果的引用。在 Angular 中,它们是通过 $q service 创建的。

$q.defer() 创建一个具有特殊方法的对象,其中包括resolve() 和reject()。 resolve() 方法表示成功完成执行并包装数据以供稍后返回的承诺。如果出现问题,应调用 reject() 方法,发送错误对象或错误消息。

这个函数应该有一个调用者,这个调用者应该捕获一个对 promise 对象的引用。

这里可以调用then()方法获取结果或根据情况处理错误。请注意,then() 方法有 2 个参数,它们是在成功或出错的情况下将要执行的函数。

在link3中可以看到有一部分代码定义了名为getData的异步函数,之后调用then()获取结果,这个调用是由异步函数getData.

在link2 控制器中FatherCtrl 是调用then() 来处理服务SonService 的响应。 SonService 中还调用了then() 方法可能会让人感到困惑,但这是为了获取 HTTP GET 调用的结果,正如注释中正确解释的那样:

// the $http API is based on the deferred/promise APIs exposed by the $q service
// so it returns a promise for us by default

在此示例中,您只能看到 then() 部分,因为 $http 服务的 get() 方法是一个异步函数,完成后会相应地调用 resolve() 或 reject() 方法。

来自official documentation:

$http 服务是一个函数,它接受一个参数——一个配置对象——用于生成一个 HTTP 请求并返回一个承诺。

再一次,什么是承诺?检查此答案的开头。 $http 服务的方法的代码已经写好了。当这些方法中的任何一个被调用并完成时,它们会调用resolve() 或reject()。开发人员必须相应地编写代码才能读取此结果。 (是的,这就是我们在 cmets 中谈论的 then() ;))。

【讨论】:

  • 但是对于 $http 我们只使用 .then 而不是其中的 resolve 方法。你能解释一下为什么吗?
  • 所以你的意思是 $http cals $q.defer.resolve () 自动/隐式?
  • 更新答案@titlu.
【解决方案2】:

请说明何时将 .resolve 方法放入 .then 函数中

Absolutely never.

如果您参考your second link 中的示例,那只是一种反模式,不应使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多