【问题标题】:How to handle $http asynchronous issues in angularjs factory service?angularjs工厂服务中$http异步问题如何处理?
【发布时间】:2015-09-02 21:27:46
【问题描述】:

在工厂服务js文件中,我创建了这样一个服务:

DashboardFactory.restService = function(method) {
var teststatus = "aaa";
switch (method) {

case "getAll":

    $http.get($_REST_API_ROOT_URL + "clients").success(function(data) {
        teststatus = data;
    }).error(function(error) {
        teststatus = 'Unable to load the client data: ' + error.message;
    });
    teststatus = "bbb";
    break;

}
return teststatus;
};

在控制器中,代码是这样的:

$scope.AllClients=DashboardFactory.restService("getAll","","");

我也把“AllClients”放在html页面上来监控结果:

{{AllClients}}

我认为“AllClients”应该显示来自远程服务器的 API 数据。但实际上它总是给我“bbb”。

我该怎么办?

提前致谢!

【问题讨论】:

    标签: javascript angularjs http web


    【解决方案1】:

    teststatus 被设置为“bbb”并在 API 调用完成之前返回,因为调用是异步的。

    请参阅AngularJS $http call in a Service, return resolved data, not promises,了解从 API 调用返回数据的不同方式。

    你想要做的是在你的 .success()/.error() 函数的末尾返回 teststatus 而不是在外面。这样,它只会在完成 API 调用并将其设置为调用返回的数据后返回。

    【讨论】:

    • 这正是我想做的。那我该怎么做呢?我对 angularjs 很陌生。
    • 删除函数末尾的return teststatus; 行。然后在每次在 success()error() 函数中分配 teststatus 值之后添加 return teststatus;
    • 这将从成功方法返回它们,而不是从服务返回。
    • 对不起,我忽略了这一点。请参阅stackoverflow.com/questions/27238928/… 以从您的通话中返回数据。
    【解决方案2】:

    方法一:您根本不需要退货。您可以将您的模型发送到服务RestService.getAllClients = function(myModel),在成功时为模型设置属性myModel.AllClients = data;,然后使用{{myModel.AllClients}} 显示它。直接在传入的模型上设置属性将自动更新绑定。

    示例:http://jsbin.com/muxijozofa/edit?html,js,output

    方法 2: 否则您需要返回整个 get 调用,这将返回一个 promise,然后您需要根据 f.e @ 在控制器上解析它987654322@

    重构提示:您可以构建一个通用的 rest-service 工厂,然后为每种类型的调用实现它,而不是构建一个充满 switch-case:s 的“包罗万象”的 rest 服务.因此,您可以为每种类型的休息调用提供一种方法。然后您将调用RestService.getAllClients 而不是DashboardFactory.restService,它会根据上述方法设置数据或返回一个promise。

    switch-case 不利于功能选择,您隐藏了功能并使代码容易出现隐藏错误。

    【讨论】:

      猜你喜欢
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      相关资源
      最近更新 更多