我如何 return 从我的服务到我的控制器的承诺?

How do I return a promise from my service to my controller?

我问过这是几个变体,但我现在有一些确定的代码,其中包含一个我无法挖掘的错误。

我有这样的 Angular 服务:

.service("lookupDataService", [
        '$q', '$http', '$timeout',  function($q, $http, $timeout) {
    this.brokers = function() {
        var cachedBrokers = localStorage.getItem("brokers");

        if (!cachedBrokers) {
            return $http.get('/api/brokers')
                .success(function (data) {
                    localStorage.setItem("brokers", data);
                });
        } else {
            return $timeout(function () {
                return {
                    "data": localStorage.getItem("brokers")
                }
            }, 1000);
        }
    }
}])

并且我在我的控制器中使用此服务

$scope.loadData = function() {
    $scope.promise = $q.all([
        lookupDataService.brokers()
        .then(function(data) { $scope.enquiriesBrokers = data; }),
    ]);
};

现在我知道这段代码有几个问题,但我主要专注于尝试 return 服务对我的控制器的承诺。例如,$q 显然对它的承诺没有任何作用,但我向你保证它会在后面的代码中执行。

检查服务中的数据会检索到所需的结果,但是当这滴入控制器时,数据是 [Object object] 而不是这些的数组。

我如何 return 我没有承诺?

这是来自服务的 JSON returned 示例:

这里是 HTML 的示例:

<div class="col-sm-4">
    <label for="enquiries-broker">Broker:</label>
    <select ng-model="equiriesSelectedBroker" class="form-control" ng-options="broker.brokerCodeField for broker in enquiriesBrokers" id="enquiries-broker">
        <option value="">Please select a broker</option>
    </select>
</div>

使用 $q 对象和 return promise

.service("lookupDataService", [
    '$q', '$http', '$timeout',  function($q, $http, $timeout) {
this.brokers = function() {
   var defer = $q.defer()

    var cachedBrokers = localStorage.getItem("brokers");

    if (!cachedBrokers) {
          $http.get('/api/brokers')
            .success(function (data) {
                 // defer resolve
                 defer.resolve({data:data}) 
                localStorage.setItem("brokers", angular.toJson(data));
            });
    } else {
         // defer resolve
         defer.resolve({data:angular.fromJson(cachedBrokers) })
    }
   // defer return promise
   return defer.promise;
  }
 }])

所以即使没有 $http 调用

,你也会总是从服务中得到承诺

编辑:

用 JSON 填充 SELECT 因此 ng-model 将获得 userIdField

broker.userIdField as broker.brokerCodeField for broker in enquiriesBrokers 表示使用 broker.userIdField 作为值,使用 broker.brokerCodeField 作为标签

<select ng-model="equiriesSelectedBroker" class="form-control" 
ng-options="broker.userIdField as broker.brokerCodeField for broker in enquiriesBrokers" id="enquiries-broker">
    <option value="">Please select a broker</option>
</select>