繁体   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