Javascript 如何正确使用承诺或回调
尝试让函数在所有异步进程完成后输出变量的结果。为了做到这一点,我学会了我必须使用承诺,因此我花了一天的时间来学习这些承诺 我已经用承诺编写了我的函数,并且看过很多教程,但是我仍然会遇到这个错误,不确定我做错了什么。这可能与我使用kpiDefault所做的工作有关,或者与我如何编写kpiAverage函数有关。此外,我使用的咖啡脚本,所以它甚至可能是一个语法问题 这是我的kpiAverage代码Javascript 如何正确使用承诺或回调,javascript,angularjs,coffeescript,promise,Javascript,Angularjs,Coffeescript,Promise,尝试让函数在所有异步进程完成后输出变量的结果。为了做到这一点,我学会了我必须使用承诺,因此我花了一天的时间来学习这些承诺 我已经用承诺编写了我的函数,并且看过很多教程,但是我仍然会遇到这个错误,不确定我做错了什么。这可能与我使用kpiDefault所做的工作有关,或者与我如何编写kpiAverage函数有关。此外,我使用的咖啡脚本,所以它甚至可能是一个语法问题 这是我的kpiAverage代码 kpiAverage = (period, kpiName, params) ->
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对象作为输出接收
// 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;
};
这就是我如何使用诺言,希望这能帮助你
正如你所见,你创造了一个推迟的未来,有些人称之为未来。您在函数末尾返回它,它将表示您的结果。一旦异步函数返回结果,如果一切正常。成功回调是调用,延迟是解析。在这种情况下,您应该在我编写的地方得到结果。然后functionresult。。。否则.error将被调用,然后您将检索以获取错误原因
简短回答
我看不到您的代码中有任何地方可以解析或拒绝延迟,因此我认为这就是为什么您的输出显示:
Object {then: function, catch: function, finally: function}
看起来您误解了承诺和异步流。您不返回东西,而是使用回调。我建议您阅读有关连续传递样式CP的内容,以及它如何应用于异步代码。它将消除您的困惑。请注意代码中的错误。你可以避免,因为承诺链。也相关:嗯。。。之前有人告诉我我需要回电我想这就是承诺的目的,我该如何回电?回调到底是什么?我确实这样做了,我将VariableResult命名为而不是deferred,现在我将更改它。successfunction数据{deferred.resolvedata;}。errorfunctionerror{deferred.reject;};我在你的代码中看不到等价物。这样做的结果是,当成功或拒绝到达时,它将更改对象{then:function,catch:function,finally:function}并产生结果。您是否认为添加另一个。然后到kpiAverage函数将起作用?好吧,我的坏消息,您实际解决了它。我正在看它试图理解我不知道你使用的语法^^这是咖啡脚本吗?是的,这是你可以访问的咖啡脚本,以获得纯js翻译
Object {then: function, catch: function, finally: function}