【发布时间】: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