如何正确使用promises或回调

时间:2014-08-25 07:45:18

标签: javascript angularjs coffeescript promise

一旦完成所有异步处理,尝试获取一个函数来输出变量的结果。要做到这一点,我已经知道我必须使用承诺,所以我花了一天时间来了解它们。

我用promises编写了我的函数,并查看了很多教程,但我仍然遇到这个错误,不知道我做错了什么。它可能与我使用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对象作为输出

1 个答案:

答案 0 :(得分:0)

// 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轻松希望这可以帮到你。

正如你所看到的,你创造了一个延迟(有些人称之为未来)。你在函数的末尾返回它,它将代表你的结果。一旦你的异步函数返回结果,如果一切都很好,.success回调就是调用,延迟就是解决,在这种情况下,你应该得到我写的结果.then(函数(结果)......否则.error是调用然后你检索得到错误的原因。

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

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