簡體   English   中英

再次承諾的承諾(Angular JS)

[英]The promise of a promise again (Angular JS)

更新了HTTP和基於請求的初始代碼/請查看帖子底部:

我最近在AngularJS學習曲線上發布了幾個問題,因此SO社區很棒。 過去我曾經是傳統的C程序員,最近開始編寫自己的ionic / Angular JS應用程序。 在將自定義函數轉換為Promise時,我在傳統異步調用的Promise版本方面苦苦掙扎。 我認為我不太了解,我發現各種示例都非常人為。 我將不勝感激。 我有一些無法正常工作的代碼,還有一些概念上的問題:

讓我們來看看這個簡單的函數:

angular.module('zmApp.controllers').service('ZMDataModel', function() { return { getMonitors: function () { return monitors; } }

getMonitors是一個簡單的函數,基本上返回監視器數組。 但是有一個難題:當應用程序首次啟動時,我調用一個執行http獲取操作的http工廠,然后開始填充此監視器列表。 此http工廠與此服務不同,但會在此服務中調用setMonitor方法以填充數組。 填充數組時,將名為“ monitorsLoaded”的變量設置為1。當將此變量設置為1時,我確定可以加載監視器。

現在,我有了一個名為“ MontageCtrl”的控制器的視圖。 我想等待監視器加載后再顯示視圖。 在上一篇文章中,一個人建議我使用路由解析,但是我必須首先將getMonitors轉換為Promise。 所以這就是我所做的:

angular.module('zmApp.controllers').service('ZMDataModel',  function($q) {
getMonitors: function () {

            var _deferred  = $q.defer();
            if (monitorsLoaded!=0)
            {
                console.log ("**** RETURNING MONITORS *****");
                    _deferred.resolve(monitors);
            }
            console.log ("*** RETURNING PROMISE ***");
            return _deferred.promise;
        },

接下來,在app.js中,我按如下所示連接了路由:

  .state('app.montage', { data: {requireLogin:false}, resolve: { message: function(ZMDataModel) { console.log ("Inside app.montage resolve"); return ZMDataModel.getMonitors(); } }, 

最后,我修改了控制器,以實現如下承諾:

 angular.module('zmApp.controllers').controller('zmApp.MontageCtrl', function($scope,$rootScope, ZMHttpFactory, ZMDataModel,message) { //var monsize =3; console.log ("********* Inside Montage Ctrl"); 

似乎基於日志,我從不進入Montage Ctrl。 路由解析似乎一直在等待,而我的日志顯示一段時間后,monitorLoaded設置為1。

我有幾個概念性問題:

a)在示例中精心設計的getMonitors函數中,為什么人們返回_deferred.promise但只分配_deferred.resolve? (即為什么不退還它?)。 它會自動返回嗎?

b)我注意到,如果我將var _deferred定義移到我的服務中並移出其子函數,它確實可以工作,但是具有相同路由依賴關系的下一個視圖卻不起作用。 我很困惑

c)最后,我准備在某個地方進行路由解析時,服務和工廠之間是有區別的,因為服務僅實例化一次。 我也很困惑,因為在某些途徑中,人們在使用示例時會使用示例,而我正在使用.state。 在這個階段,我陷入了自己的困惑。 有人可以幫忙澄清一下嗎? 我真正想要的是讓各種視圖都等到monitorsLoaded為1為止。我想通過路由解析和承諾來做到這一點,因此我一勞永逸地擺脫了承諾的束縛。

補充:這是HTTP工廠代碼以及在應用程序首次啟動時調用此代碼的app.run代碼。 僅供參考,http工廠運行良好-當我編寫ZMDataModel時問題就開始出現-我希望它成為供所有控制器使用的中央數據存儲庫-因此,他們不必每次都調用HTTP Factory來訪問數據,因此我可以控制何時需要調用HTTP工廠

 angular.module('zmApp.controllers').factory('ZMHttpFactory', ['$http', '$rootScope','$ionicLoading', '$ionicPopup','$timeout','ZMDataModel', function($http, $rootScope, $ionicLoading, $ionicPopup, $timeout,ZMDataModel) { return { getMonitors: function() { var monitors = []; var apiurl = ZMDataModel.getLogin().apiurl; var myurl = apiurl+"/monitors.json"; return $http({ url: myurl, method: 'get' }) //http .then(function(response) { var data = response.data; //console.log("****YAY" + JSON.stringify(data)); // $rootScope.$broadcast ('handleZoneMinderMonitorsUpdate',monitors); $ionicLoading.hide(); ZMDataModel.setMonitors(data.monitors); ZMDataModel.setMonitorsLoaded(1); //monitors = data.monitors; return ZMDataModel.getMonitors(); }, function (result) { console.log ("**** Error in HTTP"); $ionicLoading.hide(); ZMDataModel.setMonitorsLoaded(1); //$ionicPopup.alert ({title: "Error", template:"Error retrieving Monitors. \\nPlease check if your Settings are correct. "}); return ZMDataModel.getMonitors(); } ); //then }, //getMonitors 

這是app.run中的代碼,該代碼首先調用此代碼:

 .run(function($ionicPlatform, $ionicPopup, $rootScope, $state,ZMDataModel, ZMHttpFactory) { ZMDataModel.init(); var loginData = ZMDataModel.getLogin(); if ( loginData.username && loginData.password && loginData.url && loginData.apiurl) { console.log ("VALID CREDENTIALS. Grabbing Monitors"); // this calls http factory getMonitors that eventually populated the ZMDataModel // monitors array and sets monitorsLoaded to 1 ZMHttpFactory.getMonitors(); } } 

我終於解決了所有問題。 我的最初嘗試存在各種問題。 我最后解決的解決方案是在這里, 我是否正確返回了這個承諾?

的學習:

a)將HTTP進入工廠,將數據模型分離到另一個服務,這不必要地使生活變得復雜。 但是,分離並不是問題。 實際上,在第一次運行時,上面對諾言進行編碼的方式是,如果monitorsLoaded為0,它將簡單地返回推遲的諾言,並且沒有“ .success”或類似的構造讓我再次進入解析代碼塊。

b)讓我循環跑動的最大事情是推遲或拒絕僅僅是設置狀態。 回報永遠是承諾-它會返回您設置的狀態。 我認為return d.promise始終意味着返回“進行中”。

暫無
暫無

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

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