32

次の angularjs コードがあります。

$scope.clients = commonFactory.getData(clientFactory.getClients());
if ($scope.clients.length > 0) {
    $scope.sampleForm.ClientId = $scope.clients[0].ClientId;
}

そして、commonFactory の getData 関数:

factory.getData = function (method) {
    method.then(function (response) {
        return response.data;
    }, function (error) {
        $rootScope.alerts.push({ type: 'error', msg: error.data.ExceptionMessage });
    });
};

問題は、非同期呼び出しのためにその行にヒットしたときに $scope.clients.length が未定義であることです。

$scope.clients が割り当てられていることがわかるまで、長さチェックを行わない方法はありますか? 私はこのようなものを見てきました:

$scope.clients = commonFactory.getData(clientFactory.getClients()).then(function () {
    if ($scope.clients.length > 0) {
        $scope.sampleForm.ClientId = $scope.clients[0].ClientId;
    }
});

私の約束を連鎖させようとしてthenいますが、サイコロはありません...ここでの目標は、getDataメソッドを使用して、エラーをキャッチするためのボイラープレートコードの束を回避することです...多分私はこれについて間違っているのでしょうか?

4

1 に答える 1

34

これは、promise の最も基本的な状況です。非同期操作を開始するときに約束し、非同期操作が完了したときにvar deferred = $q.defer()約束を解決し、関数に戻るだけです。Angular の非同期メソッドはこれを内部的に行い、Promise を既に返しているため、. promise を返すものにa を付けることができます。さらに、関数から値を返す場合、チェーンが継続できるように、その値は promise でラップされます。deferred.resolve(result)deferred.promise$q.defer().thenthenthen

angular.module('myApp', [])

.factory('myService', function($q, $timeout, $http) {
  return {
    myMethod: function() {
      // return the same promise that $http.get returns
      return $http.get('some/url');
    }
  };
})

.controller('myCtrl', function($scope, myService) {
  myService.myMethod().then(function(resp) {
    $scope.result = resp.data;
  });
})

そして、ここにチェーンを使ったもう少し楽しいものがあります:

.factory('myService', function($q, $timeout, $http) {
  return {
    myMethod: function() {
      // return the same promise that $http.get returns
      return $http.get('some/url').then(function() {
        return 'abc';
      });
    }
  };
})

.controller('myCtrl', function($scope, myService) {
  myService.myMethod().then(function(result) {
    console.log(result); // 'abc'
    return someOtherAsyncFunc(); // for example, say this returns '123'
  }).then(function(result) {
    console.log(result); // '123'
  });
})
于 2013-09-11T23:29:15.617 に答える