【问题标题】:How to correctly use promises or callbacks如何正确使用承诺或回调
【发布时间】:2014-10-18 07:52:53
【问题描述】:

一旦所有异步过程都完成后,尝试获取一个函数来输出变量的结果。为此,我了解到我必须使用 Promise,因此我花了一天时间学习它们。

我已经用 Promise 编写了我的函数并查看了许多教程,但我仍然收到此错误,不确定我做错了什么。这可能与我对 kpiDefault 所做的事情或我如何编写我的 kpiAverage 函数有关。我也在使用咖啡脚本,所以它甚至可能是一个语法问题。

这是我的 kpiAverage 代码

  kpiAverage = (period, kpiName, params) ->
    result = $q.defer()
    Sads.shops.getList(params).then (data) ->
      shops = data.map((d) ->
        new ScopeShopWithMetrics(d, $scope.organizations.current)
      )
      $q.all(shops.map((d) ->
        d.getAverages period
      )).then( ->
        shopSum = 0
        i = shops.length
        shopSum += shops[i]["metrics"][kpiName]["value"]  while i--
        shopAverage = shopSum / shops.length)
      .then((shopAverage) ->
          result.resolve shopAverage
          result.promise
        )

现在这里是产生错误的代码

kpiDefault = kpiAverage(period7, "visits", testParams).then((shopAverage) ->
   shopAverage
  )

如果我这样做,我不会收到错误,但输出不是数字,它看起来像是一个承诺对象。

kpiDefault = kpiAverage period7, "visits", testParams

输出

Object {then: function, catch: function, finally: function}

编辑:

所以看起来我使用的 Promise 都错了,但这让我更加困惑。我只是希望在异步过程完成后返回值,但现在我比以往任何时候都更加迷茫。

查看代码并找出为什么它给我那个错误(旧代码被意外取消注释)但我仍然收到承诺对象作为输出

【问题讨论】:

  • 看起来你误解了承诺和异步流程。你不返回东西,你使用回调。我建议您阅读有关延续传递样式 (CPS) 以及如何将其应用于异步代码的内容。它会消除你的困惑。
  • 请注意代码中的deferred anti pattern。你可以避免这种情况,因为 Promise 链。
  • hmmm... 之前有人告诉我我需要回调,我认为这就是 promise 的用途,我将如何为此进行回调?究竟什么是回调?

标签: javascript angularjs coffeescript promise


【解决方案1】:
// Here is my function in my Factory which retrieve DATA.
result.retrieveResult = function(){
var deferred = $q.defer();

return $http.get( constant.adressApi + 'result', { cache : true, params :{ 'limit' : 50 } } )

.success(function (data) { deferred.resolve(data); })
.error(function(error){ deferred.reject(); });

return deferred.promise;
};

    // Here is my call to the function from my factory service.
    presentationService.retrieveResult()
    .then(function(result){
    $scope.result = result.data;
    });

这就是我轻松使用 Promise 的方式,希望对你有所帮助。

如您所见,您创建了一个 deferred(有些人称之为 futur)。您在函数末尾返回它,它将代表您的结果。一旦您的异步函数返回结果,如果一切正常,就会调用 .success 回调,并且在这种情况下解决延迟问题,您应该得到我写的结果 .then( function(result) ... 否则 .error 是调用,然后你检索得到错误的原因。

简答 我在您的代码中看不到您解决或拒绝您的延迟的任何地方,所以我认为这就是您的输出显示的原因:

Object {then: function, catch: function, finally: function}

【讨论】:

  • 我正是这样做的,我将我的变量结果命名为 deferred,我现在要更改它
  • .success(function (data) { deferred.resolve(data); }) .error(function(error){ deferred.reject(); });我在您的代码中看不到等效项。发生的情况是,当成功或拒绝将达到时,它会改变你的 Object {then: function, catch: function, finally: function} 结果
  • 你认为向 kpiAverage 函数添加另一个 .then 会起作用吗?
  • 好吧,我的错,你实际上解决了它。我正在看它试图理解我不知道你使用的语法^^是那个咖啡脚本吗?
  • 是的,这是咖啡脚本,您可以访问 js2coffee.thomaskalka.de 获得纯 js 翻译
猜你喜欢
  • 2013-10-06
  • 1970-01-01
  • 2016-08-18
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多