javascript - then - 解決済みの約束をサービスに挿入する




q reject() (2)

あなたがそれを呼び出すとき、あなたのサービス関数はすぐにその本体を評価するので(あなたが約束するように)あなたは約束を得る。 通常、サービスはオブジェクトを返す必要があります。そのため、コンシューマ(別のサービス、コントローラなど)は、必要に応じてそのオブジェクトの関数を呼び出すことができます。

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;
  }
}

;));

https://code.i-harness.com

その情報に依存する一連のサービスを設定する前に、サーバーから情報(スキーマ)を取得する必要があります。

私のサーバーはモデルのさまざまなプロパティを定義するスキーマを提供しています。 私のAngularコードでは、このスキーマを取得するサービスがあります。

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;
});

スキーマに依存する他のサービスに、約束ではなくスキーマオブジェクトを挿入したいと思います。 $ 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) {
        ...
    });
});

私はこれを行うことができる方法はありますか?


あなたが望むものは延期されたブートストラップです。 この目的のために書かれたプラグインが既にあります - https://github.com/philippd/angular-deferred-bootstrap

http://plnkr.co/edit/VfISHNULXRLe52NeAsn1?p=preview - plunkrで例を作成します。

*既存の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;
        }
    }
});




angular-promise