并行等待多个 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();
} );
我正在为 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();
} );