如何将服务中的承诺退还给我的控制器?

时间:2015-05-05 11:23:55

标签: javascript angularjs angular-promise

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

我有一个像这样的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; }),
    ]);
};

现在我知道这个代码存在一些问题,但我主要关注的是尝试从服务中向我的控制器返回一个promise。例如,$ q显然没有做任何承诺,但我向你保证它会在代码的后期发生。

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

如果我没有承诺,我该如何回复?

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

JSON in Fiddler

以下是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>

1 个答案:

答案 0 :(得分:2)

使用 $ q 对象并返回承诺

CREATE TABLE `emp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `salary` int(10) DEFAULT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

即使没有$ http电话,你也会始终得到承诺

修改

使用JSON填充SELECT salary FROM emp WHERE salary = (SELECT DISTINCT(salary) FROM emp AS e1 WHERE (n) = (SELECT COUNT(DISTINCT(salary)) FROM emp AS e2 WHERE e1.salary <= e2.salary)) ,以便.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; } }]) 获得 userIdField

SELECT告诉您使用ng-model作为值,使用broker.userIdField as broker.brokerCodeField for broker in enquiriesBrokers作为标签

broker.userIdField