4

我正在尝试解决几个 ajax 调用,以便我的控制器需要的数据在它(以及它提供的指令)执行之前可用。执行顺序是有效的,但是,不是返回我创建的对象,而是注入到我的控制器中的结果是 $http 的响应对象:

{
  config: { … },
  data: { … },
  headers: { … },
  status: 200
}

我的代码基本上看起来像:

app.config([
  '$routeProvider', function($routeProvider)
  {
    $routeProvider
      .when('/path', {
        …,
        "resolve": {
          "data": [
            '$http',
            function($http)
            {
              return $http
                .get('/api/data')
                .success(function(data,status) { return data.rows[0]; })
                .error(function(data,status)   { return false; });
            }
          ]
        }
      });
  }
]);

我傻吗?$http 成功的返回值不应该是 $http 返回的值吗?

我也试过

…
"resolve": {
  "data": [
    '$http',
    function($http)
    {
      var response;
      $http
        .get('/api/data')
        .success(function(data,status) { response = data.rows[0]; })
        .error(function(data,status)   { response = false; });
      return response;
    }
  ]
}

但是data注入到我的控制器中的对象是未定义的(我猜是因为 $http 是异步的并且resolve没有被 $http 阻塞,所以它在 $http 准备好之前返回)。

PS $http 的同步性应该在其选项对象中定义!

解决方案

app.config([
  '$routeProvider', function($routeProvider)
  {
    $routeProvider
      .when('/path', {
        …,
        "resolve": {
          "data": [
            '$http',
            function($http)
            {
              return $http
                .get('/api/data')
                .then(
                  function success(response) { return response.data.rows[0]; },
                  function error(reason)     { return false; }
                );
            }
          ]
        }
      });
  }
]);

感谢Ajay beniwal 的指针Mark Rajcok 的指针

PSthen()记录在$q的页面上

4

1 回答 1

2

$http @returns {HttpPromise} 返回一个带有标准then方法和两个 http 特定方法的 {@link ng.$q promise} 对象:successerror. 该then 方法接受两个参数,一个成功和一个错误回调,将使用响应对象调用。success和方法采用error单个参数 - 分别在请求成功或失败时调用的函数。传递给这些函数的参数是传递给 then方法的响应对象的解构表示。响应对象具有以下属性:

于 2013-07-17T17:50:21.220 回答