将一个服务(工厂)注入另一个服务,这两个服务都是异步的

时间:2014-10-02 16:59:20

标签: javascript angularjs dependency-injection angularjs-scope

我应该做以下事情:

  • 使用$q(异步)
  • ,可能通过服务/工厂查询大型名称数据集的API
  • 有另一个服务(也是异步),如果它们匹配某个字符串(搜索字段),它应该只返回上述工厂的元素。目的是缩小值,以便有相当少的值,以便我的选择框可以处理它。

    • 我的控制器应该调用第二个服务,获取这些值并分配给$scope属性以供选择框(指令)进一步使用。

我想我应该只在控制器中注入第二个(缩小值)服务/工厂。第一个工厂(大型数据集)应作为依赖项注入第二个服务中,进行比较,从而创建缩小的结果集。

但是,当我使用大型数据集注入工厂时,我不确定我应该如何将其数据分配给变量/对象,以便我可以在第二个工厂中进一步使用它。 如果我console.log,它会显示为承诺

Object {then: function, catch: function, finally: function}

而不是返回数据集。

首先提到的工厂:

    .factory('MedicationDisplayNamesFactory', function MedicationDisplayNamesFactory($http, $q){

        return {
            getDisplayNames: function(){
                return $http({
                    method: 'GET',
                    url: 'http://rxnav.nlm.nih.gov/REST/spellingsuggestions?name=ambien',
                    headers: {
                        'Content-type': 'application/json'
                    }
                });
            }

        };

        return MedicationDisplayNamesFactory;

    })

第二个:

    .factory('MedicationMatchingNamesFactory', 
                ['$http', '$q', '$timeout', 'MedicationDisplayNamesFactory', 
                    function MedicationMatchingNamesFactory($http, $q, $timeout, MedicationDisplayNamesFactory){

        return {
            getMatchingNames: function(){
                var foo = MedicationDisplayNamesFactory.getDisplayNames().then(
                            function(response){
                                var bar = response.data.suggestionGroup.suggestionList.suggestion;
                            }
                        );

                console.log(foo);

                return foo;

            }
        };   


        return MedicationMatchingNamesFactory;

    }])

在控制器中,我应该可以打电话:

$scope.myData = MedicationMatchingNamesFactory.getMatchingNames();

像这样。

2 个答案:

答案 0 :(得分:1)

我为HTTP响应创建了一个回调函数,并将其作为参数传递给getMatchingNames:



<!doctype html>
<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.js"></script>
    </head>
    <body ng-app="plunker">
        <div  ng-controller="MainCtrl">
            <ul>
                <li ng-repeat="name in myData">
                    {{name}}
                </li>
            </ul>
        </div>
        <script>
            var app = angular.module('plunker', []);
            app.controller('MainCtrl', ['$scope', 'MedicationMatchingNamesFactory', function($scope, MedicationMatchingNamesFactory) {
                var setMyData = function(myData) {
                    $scope.myData = myData;
                }
                
                MedicationMatchingNamesFactory.getMatchingNames(setMyData);
            }]).factory('MedicationDisplayNamesFactory', function MedicationDisplayNamesFactory($http, $q){

                return {
                    getDisplayNames: function(){
                        return $http({
                            method: 'GET',
                            url: 'http://rxnav.nlm.nih.gov/REST/spellingsuggestions?name=ambien',
                            headers: {
                                'Content-type': 'application/json'
                            }
                        });
                    }

                };

                return MedicationDisplayNamesFactory;

            }).factory('MedicationMatchingNamesFactory', 
                       ['$http', '$q', '$timeout', 'MedicationDisplayNamesFactory', 
                        function MedicationMatchingNamesFactory($http, $q, $timeout, MedicationDisplayNamesFactory){
                            return {
                                getMatchingNames: function(callback){
                                    MedicationDisplayNamesFactory.getDisplayNames().then(function(response){
                                        var data = response.data.suggestionGroup.suggestionList.suggestion;
                                        callback(data);
                                    });
                                }
                            };   
                        }]);
        </script>
    </body>
</html>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我无法接受提供的答案,因为我没有测试它 - 我简化了两个工厂,最后使用sessionStorage将一个工厂的结果集保留在内存中,同时缩小了该值。第二

这可能对其他人有用,所以我把它放在这里:

// save the large dataset to sessionStorage
sessionStorage.allNames = angular.toJson(allNames);

// read saved dataset and assign it to a variable
var allNames = angular.fromJson( sessionStorage.allNames );