等待角js工厂请求得到响应

时间:2016-03-18 06:02:21

标签: javascript ruby-on-rails angularjs angularjs-directive

我在我的rails应用程序中使用angular,下面是代码片段,它们执行api请求并执行.run中的代码。有时api响应仍处于挂起状态并且代码已执行。这导致指令无法按预期正确加载。 ex-ng-if取决于要加载的东西的某些数据,但由于数据不可用。它错过了显示消息。

}).factory('ApiDataCall', function ($resource) {
  return $resource('api_data/check_errors');

}).run(function ($rootScope, $timeout, $navigationWarning,$window, ApiDataCall) {

  ApiDataCall.get(function (data) {
    $rootScope.require_redirect = data;
  });

我想知道如何延迟确认请求已完成。我发现$ q.defer()和promise都可以解决这个问题,但无法弄清楚这个方法。如果我方需要任何其他输入,请告诉我。

1 个答案:

答案 0 :(得分:2)

ApiDataCall需要返回Angular承诺。然后你可以做类似的事情:

ApiDataCall.get(function (data) {
    $rootScope.require_redirect = data;
    }).then(function success(response) {
        //Do something here that requires ApiDataCall.get() to complete 
    }, function failure(response) {
       //Do something here if the call fails.
    }
);

实现承诺的一种简单方法是使用$ q。例如 让ApiDataCall.get返回:

return $q.when({foo: "bar"});

取得成功。和

return $q.reject();

失败

允许传递给then()中各个函数的响应对象为{foo:“bar”}