簡體   English   中英

將已解決的承諾注入服務中

[英]Injecting a resolved promise into service

在設置依賴於該信息的一堆服務之前,我需要從服務器獲取一些信息(模式)。

我的服務器提供了一個定義模型各種屬性的模式。 在我的角度代碼中,我有一個獲取此架構的服務:

services.factory('schema', function($q, $http) {
    var deferred = $q.defer();
        $http.get('schema/').then(function(response) {
        schema = // some function of response.data
        deferred.resolve(schema);
    }, function() {
        deferred.reject('There was a problem fetching the schema');
    }); 
        return deferred.promise;
});

我想將架構對象而不是promise作為注入依賴於架構的其他服務。 $ routeProvider允許我們為控制器執行此操作:

app.config(function($routeProvider) {
    $routeProvider.
        when('/', {
            controller: 'SomeCtrl',
            resolve: {
                schema: 'schema'
            },
            ...
        });
});

這允許我像這樣定義SomeCtrl:

controllers.controller('SomeCtrl', function($scope, schema) {
    // schema is an object
    ...
});

但對於服務,我必須這樣做:

services.factory('SomeService', function(schema) {
    // schema is a promise
    schema.then(function(schema) {
        ...
    });
});

有什么方法可以做到這一點嗎?

你想要的是延遲bootstrap。 已經有一個為此目的編寫的插件 - https://github.com/philippd/angular-deferred-bootstrap

我在plunkr上創建了一個例子 - http://plnkr.co/edit/VfISHNULXRLe52NeAsn1?p=preview

*您必須使用延遲引導程序替換現有的ng-app

代碼片段 -

angular.element(document).ready(function() {
    deferredBootstrapper.bootstrap({
        element: document.body,
        module: 'plunker',
        resolve: {
            schema: ['$http',
                function($http) {
                    return $http.get('schema.json');
                }
            ]
        }
    });
});

然后,您可以在控制器,服務或工廠中使用架構,就像路由解析一樣。

工廠示例代碼

app.factory('SomeService', function(schema){
    return {
        getTitle: function() {
            return schema.title;
        }
    }
});

你得到了一個承諾,因為你的服務函數在你調用它時會立即評估它的身體(正如函數那樣)。 通常,服務應返回一個對象,以便消費者(另一個服務,控制器,等等)可以在需要時調用該對象上的函數。

services.factory('schema', function($q, $http) {
return {
  get: function() {
    var deferred = $q.defer();
    $http.get('schema/').then(function(response) {
      schema = // some function of response.data
      deferred.resolve(schema);
    }, function() {
      deferred.reject('There was a problem fetching the schema');
    });
    return deferred.promise;
  }
}

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM