【问题标题】:angular, correct way for a function callback有角度的,函数回调的正确方法
【发布时间】:2014-11-05 22:14:55
【问题描述】:

我正在用 Angular js 为我的应用程序编写 ItemProvider。 我选择了一项服务。

app.factory('ItemProvider', function($http) {
  var url = "http://localhost:7888/api.php/json?";

  return {
    get_data: function() {          
      $http.get(url).
        success(function(data,status,headers,config) {
          json = data;
          console.log("app returned ok");
          console.log(json);
          callback(json);
        }).

        error(function(data,status,headers,config) {
          console.log("Error getting data from app!");
          json = data;
          callback(json);
        });

      callback = function(json) {
        console.log("callback");
        return json;
      }
      console.log("already done");
    }
  };
});

当然,这里发生的是get_data 在通过$http 实际调用后端之前立即返回...

我如何正确地拥有一个从后端返回数据的get_data 函数?我尝试添加一个回调(参见上面的代码),但我意识到当它被调用时,get_data 也已经完成了......

【问题讨论】:

  • “我如何正确地拥有一个从后端返回数据的 get_data 函数?” 这是不可能的。 get_data 要么必须接受回调,要么返回承诺。

标签: javascript angularjs function asynchronous


【解决方案1】:

$http 被硬编码为只能异步工作,这意味着您唯一的选择是在编写代码时牢记这一点。因此,get_data 不可能直接返回数据,相反,它必须要么接受回调,要么返回承诺。 在我看来,promise 路线要容易得多。

app.factory('ItemProvider', function($http) {
  var url = "http://localhost:7888/api.php/json?";

  return {
    get_data: function(url) {          
      return $http.get(url);
    }
  };
});

示例用法:

//...
ItemProvider.get_data('/items')
  .success(function (items) {
    console.log(items);
  })
  .error(function () {...});
//...

【讨论】:

  • 我喜欢 Promise 解决方案!我有两个提供商,我将使用其中一个或另一个。我不想过多地改变界面,所以对我来说拥有 Promise 看起来比添加回调更优雅。
  • promise 解决方案的另一个好处是,因为它是一个 promise,您可以使用 .then 在从服务返回结果之前转换结果。 .then(function (result) {return transformResult(result);})。对于count 之类的方法来说真的很不错,因此您可以返回一个数字,而不是通常从rest api 返回的具有count 属性的对象。
  • 确实我很可能需要这个功能,因为我需要过滤这些数据!最受欢迎的补充,谢谢!
猜你喜欢
  • 2018-09-05
  • 2019-01-13
  • 1970-01-01
  • 2023-03-10
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
相关资源
最近更新 更多