等待对象创建- (JavaScript/AngularJS)

Wait until Object created - (JavaScript/AngularJS)

本文关键字:AngularJS JavaScript 对象 创建 等待      更新时间:2023-09-26

我有一个工厂和一个控制器。

工厂

vm.profiles = new ProfileFactory();
控制器

if (Object.keys(vm.profiles.items).length == 0) {
      vm.noProfiles = true;
}

我有一个原型nextPage()在ProfileFactory -> vm。配置文件对象。此方法查询后端。我想设置虚拟机。如果vm.profiles.items中没有项,则noProfiles变量为true。

问题

它会自动进入if语句,因为if不会等到项目通过原型方法nextPage()填充。

我怎样才能强制JavaScript等待,直到它被填充?有没有更好的解决方案?

//编辑

这是nextPage方法的一部分。我应该在控制器中进行查询,然后从Restangular或$http返回承诺吗?

// Get List of Posts
            Restangular.allUrl('user', ApiConfig.baseUrl + ':' + ApiConfig.port + '/users').getList(query)
                .then(function (items) {
                    //console.log(items);
                    if (items.length > 0) {
                        for (var i = 0; i < items.length; i++) {
                            this.items.push(items[i]);
                        }
                        if (this.offset < items.meta.page_count) {
                            this.offset += 1;
                        } else {
                            return;
                        }
                    }
                    this.busy = false;
                }.bind(this));

如果你正在使用ui-router,你可以使用它的resolve特性来指定在你的控制器激活之前需要加载什么。

这里你需要采取两个步骤:

  1. 在路由配置中设置解析

    在控制器的路由配置中,添加resolve:键,该键带有一个函数,返回您希望在控制器激活之前预加载的项目的承诺。类似以下语句:

    $stateProvider.state('myState', {
        // ...
        resolve: {
            items: function(Restangular, ApiConfig /* add any other di's here */) {
                return Restangular.allUrl('user', ApiConfig.baseUrl + ':' +
                                           ApiConfig.port + '/users');
       }
    

    现在,当这个路由被触发时,你的控制器不会被加载,直到items:键下的函数返回的承诺被解析。这个promise的响应对你的控制器是可用的,你只需要通过:

  2. 在您的控制器中添加项目到您的控制器定义中的di:

    angular
        .module('yourModuleName')
        .controller('YourControllerName', function(..., items) {
        // ...
        // items should hold the response from the promise returning function in 
        // route config
    });