【问题标题】:Expose promises and custom methods公开承诺和自定义方法
【发布时间】:2016-02-24 04:03:22
【问题描述】:

我正在使用超媒体 API 设计一个带有 angular$http 服务的 API 客户端。由于我拥有相互叠加的资源,因此我希望客户端用户能够以声明方式执行此操作:

apiRoot
    .getPeopleRoot()
    .getPerson(1)
    .addJob(apiRoot.getJobsRoot().getRandomJob())
    .updatePerson()

但我也希望能够利用$then 方法来使用中间结果:

$scope.job = apiRoot.getJobsRoot().getRandomJob()

apiRoot.getPeopleRoot().getPerson(1).then(function (person) {
    $scope.person = person
}).addJob($scope.job).updatePerson()

我设法通过返回 promise 或包含操作这些资源的函数的对象来分别完成其中的每一项,但我不确定如何同时实现这两者,或者它是否很好想法。

编辑:我设法在我的资源对象中使用了以下 mixin

function Actualizable() {}
Actualizable.prototype.actual = function (value) {
  this.realizedValue = value
  return this
}

然后检查我是否已经解决了每个函数的值或调用了一个承诺来实际解决它。我不确定是否还有一种机制可以通过承诺来做到这一点。

【问题讨论】:

    标签: angularjs promise angular-promise


    【解决方案1】:

    承诺,返回值(或其他承诺)。

    apiRoot.getPeopleRoot().getPerson(1).then(function (person) {
        $scope.person = person;
        //return the value to chain
        return person;
    })
    

    因为调用 Promise 的 .then 方法会返回一个新的派生 Promise,所以很容易创建一个 Promise 链

    可以创建任意长度的链,并且由于可以使用另一个 Promise 来解决一个 Promise(这将进一步推迟其解决方案),因此可以在链中的任何点暂停/推迟对 Promise 的解决。

    -- AngularJS $q Service API Reference -- Chaining Promises

    另见Angular execution order with $q

    【讨论】:

    • 所以这不允许我在返回then 时调用add job(这不是人,而是对人的承诺)。或者,如果我将 Promise 的原型更改为能够调用 addJob,我如何知道调用者是人还是对人的承诺?
    • 我不建议在 Promise 中添加方法。 AngularJS 团队将.success.error 方法添加到从$http 服务返回的promise 中,这导致了很多问题。 AngularJS 团队随后决定弃用这些方法。
    • $resource 服务返回一个具有名为$promise 的属性的对象,该属性包含稍后解析为已实现对象的承诺。我更喜欢这种方法。
    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2013-07-13
    • 2021-09-20
    • 2018-06-21
    • 2018-04-16
    • 2016-02-27
    • 2015-05-21
    相关资源
    最近更新 更多