2015-08-25 2 views
0

Я разрабатываю генератор символов для системы RPG как способ обучения Угловой. У меня есть данные в 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 должны работать, если они используют $ углов главного д, но я не совсем уверен, если они делают.

Это обычно используется как этот

$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

Ваша первая версия, что я пытался до того на основе на других примерах, но сразу же выводит сообщение без ожидания. Ваше второе предложение работает так, как должно. Спасибо! –

Смежные вопросы