2015-08-25 21 views
0

我正在爲RPG系統開發角色生成器,作爲學習Angular的一種方式。我有我的數據在Firebase中,我也是新手。並行等待多個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,但它似乎沒有等待加載任何東西。我沒有太多的承諾或異步編程經驗,所以我閱讀過的許多解決方案似乎都有點壓倒性。

任何幫助表示讚賞!

回答

0

$ 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(); 
    }); 
+0

你的第一個版本是什麼我以前基於試過在其他示例中,但它立即打印消息而不等待。你的第二個建議就像它應該那樣工作。謝謝! –