2013-08-02 58 views
12

Tôi cần lấy một số thông tin (lược đồ) từ máy chủ trước khi tôi thiết lập một loạt dịch vụ phụ thuộc vào thông tin đó.Tiêm lời hứa được giải quyết vào dịch vụ

Máy chủ của tôi cung cấp lược đồ xác định các thuộc tính khác nhau của một mô hình. Trong mã góc của tôi, tôi có một dịch vụ mà được schema này:

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

Tôi muốn tiêm đối tượng schema, và không phải là lời hứa, vào các dịch vụ khác mà phụ thuộc vào giản đồ. $ RouteProvider cho phép chúng ta làm điều này cho các bộ điều khiển:

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

và điều này cho phép tôi để xác định SomeCtrl như thế này:

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

Nhưng đối với các dịch vụ, tôi phải làm:

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

Is có cách nào tôi có thể làm điều này?

+0

Không, đó chỉ là cách nó hoạt động, ít nhất là cho bây giờ. – aet

+0

Bộ định tuyến góc chờ các giá trị trong 'giải quyết' để giải quyết/từ chối trước khi khởi tạo bộ điều khiển. Sau đó, nó sử dụng các giá trị cục bộ để đưa vào bộ điều khiển (ống tiêm góc thích người dân địa phương). TL; DR: bạn đang làm việc với hai 'lược đồ' khác nhau. –

Trả lời

-1

Bạn nhận được lời hứa vì chức năng dịch vụ của bạn ngay lập tức đánh giá cơ thể của nó ngay khi bạn gọi nó (như các chức năng). Thông thường, một dịch vụ sẽ trả về một đối tượng để người tiêu dùng (một dịch vụ, bộ điều khiển khác) có thể gọi các hàm trên đối tượng đó khi cần.

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

});

+0

Trong ví dụ của bạn, phương thức 'get' vẫn trả về một lời hứa, không phải là độ phân giải của lời hứa, đó là câu hỏi được đặt ra. –

5

Điều bạn muốn là khởi động trì hoãn. Đã có một plugin được viết cho mục đích này - https://github.com/philippd/angular-deferred-bootstrap.

tôi tạo một ví dụ tại plunkr - http://plnkr.co/edit/VfISHNULXRLe52NeAsn1?p=preview

* Bạn phải thay thế hiện có ng-app với bootstrap chậm

Code Snippet -

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

Sau đó, bạn có thể sử dụng sơ đồ nào trong điều khiển , dịch vụ hoặc nhà máy giống như cách giải quyết tuyến đường.

mẫu mã cho Nhà máy

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

Chính xác những gì tôi đang tìm kiếm là tốt, cảm ơn - bootstrapping trì hoãn hoạt động như một say mê với thành phần đó! – conceptdeluxe

Các vấn đề liên quan