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