Javascript 我如何将我的服务承诺返还给我的控制员?

Javascript 我如何将我的服务承诺返还给我的控制员?,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我问过这是几个变体,但我现在有一些明确的代码,其中包含一个我无法挖掘的bug 我有一个像这样的角度服务: .service("lookupDataService", [ '$q', '$http', '$timeout', function($q, $http, $timeout) { this.brokers = function() { var cachedBrokers = localStorage.getItem("brokers");

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

我有一个像这样的角度服务:

.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; }),
    ]);
};
现在我知道这段代码有几个问题,但我主要关注的是如何从服务中向我的控制器返回一个承诺。例如,$q显然没有实现它的承诺,但我向您保证它在代码后面会实现

检查服务中的数据会检索期望的结果,但当这些结果流到控制器时,数据是[对象],而不是这些数据的数组

当我没有承诺时,我如何回报承诺

以下是服务返回的JSON示例:

下面是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对象并返回承诺

.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模型将获得userIdField

broker.userIdField as broker.brokerCodeField for broker in inquiriesbrokers
告诉我们,使用
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>

请选择一个经纪人

您需要执行
$scope.inquiriesbrokers=data.data在你的工厂成功控制方法谢谢@pankajparkar我已经添加了该代码。这解决了你的问题吗?不!我的下拉列表中充满了空元素。我认为它正在抓取数据,但可能是本地存储把它搞砸了。这看起来很棒,谢谢。我的代码现在正在编译,正在使用缓存。唯一的问题是请求此承诺的下拉列表没有填充。有什么想法吗?从上面的代码片段来看,我的控制器使用量没有改变。让我展示一下服务器上的JSON,您在HTMLI中的下拉设置已经在上面添加了更多细节。谢谢,我刚刚更新了我的答案,以反映解决方案不要忘记更改controller
$scope.inquiriesbrokers=data.data
我们忘记了使用
angular.toJson(data)
resp
angular.fromJson(data)
解析本地存储和本地存储的字符串,请参见上面的更新