Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确使用承诺或回调_Javascript_Angularjs_Coffeescript_Promise - Fatal编程技术网

Javascript 如何正确使用承诺或回调

Javascript 如何正确使用承诺或回调,javascript,angularjs,coffeescript,promise,Javascript,Angularjs,Coffeescript,Promise,尝试让函数在所有异步进程完成后输出变量的结果。为了做到这一点,我学会了我必须使用承诺,因此我花了一天的时间来学习这些承诺 我已经用承诺编写了我的函数,并且看过很多教程,但是我仍然会遇到这个错误,不确定我做错了什么。这可能与我使用kpiDefault所做的工作有关,或者与我如何编写kpiAverage函数有关。此外,我使用的咖啡脚本,所以它甚至可能是一个语法问题 这是我的kpiAverage代码 kpiAverage = (period, kpiName, params) ->

尝试让函数在所有异步进程完成后输出变量的结果。为了做到这一点,我学会了我必须使用承诺,因此我花了一天的时间来学习这些承诺

我已经用承诺编写了我的函数,并且看过很多教程,但是我仍然会遇到这个错误,不确定我做错了什么。这可能与我使用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对象作为输出接收

// 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}