并行等待多个 Firebase 调用

Waiting for multiple Firebase calls in parallel

我正在为 RPG 系统开发角色生成器,作为一种学习方式 Angular。我在 Firebase 中有我的数据,我也是新手。

进入创建表单时,我想在继续之前从类型、描述符和焦点加载所有数据。我目前的解决方案看起来像这样。

角色服务:

var types = new Firebase(URL + '/Types');
var descriptors = new Firebase(URL + '/Descriptors');
var foci = new Firebase(URL + '/Foci');
...

allTypes: function()
{
    return $firebaseArray(types);
},
allDescriptors: function()
{
    return $firebaseArray(descriptors);
},
allFoci: function()
{
    return $firebaseArray(foci);
},

角色控制器:

vm.types = Character.allTypes();
vm.descriptors = Character.allDescriptors();
vm.foci = Character.allFoci();
...

vm.types.$loaded(function() {
    vm.selectedType = vm.types[0];
    vm.descriptors.$loaded(function()
    {
        vm.selectedDescriptor = vm.descriptors[0];
        vm.foci.$loaded(function()
        {
            vm.selectedFocus = vm.foci[0];
            vm.skills.$loaded(function()
            {
                vm.abilities.$loaded(function()
                {
                    vm.ready = true;
                });
            });
        });
    });
});

这个嵌套块在我看来真的很乱。我将如何编写它来并行加载所有数据?我尝试使用 $q.all 但它似乎根本没有等待任何加载。我在 promises 或异步编程方面没有太多经验,所以我读过的许多解决方案似乎都让人不知所措。

感谢任何帮助!

$q.all 如果他们使用 Angulars $q 应该可以工作,但我不确定他们是否这样做.

一般是这样使用的

$q.all([vm.descriptors.$loaded, vm.foci.$loaded, vm.skills.$loaded])
    .then(function() {
        console.log('all resolved');
    });

如果这不起作用,您可以自己用 $q 包装他们的承诺:

var descriptorsDeferred = $q.defer();
var fociDeferred = $q.defer();
var skillsDeferred = $q.defer();

$q.all( [descriptorsDeferred.promise, fociDeferred.promise, skillsDeferred.promise] )
  .then( function ()
  {
    console.log( 'all resolved' );
  } );

vm.descriptors.$loaded()
  .then( function ()
  {
    descriptorsDeferred.resolve();
  } );

vm.foci.$loaded()
  .then( function ()
  {
    fociDeferred.resolve();
  } );

vm.skills.$loaded()
  .then( function ()
  {
    skillsDeferred.resolve();
  } );