第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

AngularJS:用異步數(shù)據(jù)初始化服務

AngularJS:用異步數(shù)據(jù)初始化服務

茅侃侃 2019-06-19 15:10:49
AngularJS:用異步數(shù)據(jù)初始化服務我有一個AngularJS服務,我想用一些異步數(shù)據(jù)初始化它。就像這樣:myModule.service('MyService', function($http) {     var myData = null;     $http.get('data.json').success(function (data) {         myData = data;     });     return {         setData: function (data) {             myData = data;         },         doStuff: function () {             return myData.getSomeData();         }     };});很明顯,這是行不通的,因為如果有東西試圖調(diào)用doStuff()以前myData獲取返回,我將得到一個空指針異常。據(jù)我所知,從所問的其他問題中,我可以看出這里和這里我有幾個選擇,但沒有一個看起來很干凈(也許我遺漏了什么):帶有“Run”的安裝服務在設置我的應用程序時,請執(zhí)行以下操作:myApp.run(function ($http, MyService) {     $http.get('data.json').success(function (data) {         MyService.setData(data);     });});那么我的服務應該是這樣的:myModule.service('MyService', function() {     var myData = null;     return {         setData: function (data) {             myData = data;         },         doStuff: function () {             return myData.getSomeData();         }     };});這在某些情況下是可行的,但是如果異步數(shù)據(jù)碰巧花費的時間比初始化所用的時間更長,則當我調(diào)用時會得到一個空指針異常。doStuff()使用承諾對象這可能管用。唯一的缺點就是我在任何地方都調(diào)用MyService,我必須知道doStuff()返回一個承諾,所有的代碼都必須返回給我們。then與承諾互動。我寧愿等到我的數(shù)據(jù)回來后再加載我的應用程序。手動引導angular.element(document).ready(function() {     $.getJSON("data.json", function (data) {        // can't initialize the data here because the service doesn't exist yet        angular.bootstrap(document);        // too late to initialize here because something may have already        // tried to call doStuff() and would have got a null pointer exception     });});全局Javascript Var我可以將JSON直接發(fā)送到全局Javascript變量:HTML:<script type="text/javascript" src="data.js"></script>data.js:var dataForMyService = { // myData here};當初始化時,它將是可用的。MyService:myModule.service('MyService', function() {     var myData = dataForMyService;     return {         doStuff: function () {             return myData.getSomeData();         }     };});這也是可行的,但是我有一個全局javascript變量,它聞起來很難聞。這是我唯一的選擇嗎?這些選擇中有一個比其他的好嗎?我知道這是一個很長的問題,但我想表明,我已經(jīng)嘗試探索我的所有選擇。如有任何指導,將不勝感激。
查看完整描述

3 回答

?
呼如林

TA貢獻1798條經(jīng)驗 獲得超3個贊

基于Martin Atkins的解,這里有一個完整、簡潔的純角度解:

(function() {
  var initInjector = angular.injector(['ng']);
  var $http = initInjector.get('$http');
  $http.get('/config.json').then(
    function (response) {
      angular.module('config', []).constant('CONFIG', response.data);

      angular.element(document).ready(function() {
          angular.bootstrap(document, ['myApp']);
        });
    }
  );})();

該解決方案使用自動執(zhí)行的匿名函數(shù)獲取$http服務,請求配置,并在配置可用時將其注入一個名為config的常量中。

一旦完全完成,我們將等到文檔準備就緒,然后引導這個角度應用程序。

這是對Martin解決方案的輕微改進,后者將獲取配置推遲到文檔準備好之后。據(jù)我所知,沒有理由推遲要求提供$http的費用。

單元測試

注意:當代碼包含在您的代碼中時,當單元測試時,我發(fā)現(xiàn)此解決方案不能很好地工作。app.js檔案。原因是上述代碼在加載JS文件時立即運行。這意味著測試框架(在我的例子中是Jasmine)沒有機會提供$http.

我的解決方案,我并不完全滿意,就是把這段代碼移到我們的index.html文件,因此Grunt/Karma/Jasmin單元測試基礎結(jié)構(gòu)看不到它。


查看完整回答
反對 回復 2019-06-19
  • 3 回答
  • 0 關注
  • 711 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號