2017-02-21 21 views
0

Мы используем угловое наследие (1.5) Я пытаюсь загрузить несколько слоев, используя стороннюю библиотеку. Мне нужно подождать, пока они не загрузятся, прежде чем продолжить. Итак, в разделе «Получить данные» он вызывает библиотеку и просит ее добавить данные, я запускаю $ q.defer в этом разделе и назначаю это переменной фабричного уровня. В службе для сторонней библиотеки lib, я устанавливаю счет для запросов и запросов, когда они совпадают, $ broadcast и event, чтобы рассказать мне об этом. Затем я слушаю ($ on) для этого события и задаю обещание разрешить. однако приложение не ждет этого. Я понимаю, что это странно, но что я могу сделать.Могу ли я решить обещание вещания?

Наш код очень востребован, поэтому я попытался создать грубый пример того, что мы пытаемся архивировать.

function layerFactory($rootScope, $log, $q, DataService) { 
    var factory = { 
     getData:getData,    
     var _dataPromise; 
     function getData(data){ 
      _getLayerData(data).then(function(){ 
       _processData(data); 
      });     
     } 
     function _getLayerData(data){ 
      _dataPromise = $q.defer(); 
      DataService.getData(data) // Treat DataService as a 3rd party lib, this doesn't return a promise. I have no way of knowing this is complete until a $broadcast is sent. 
      _dataPromise.promise; 
     } 

     $rootScope.$on('dataLoaded', function(){ 
      _dataPromise = $q.resolve(); 
     }); 
} 
    return factory; 
} 

Это не ждет обещание разрешить и вместо того, чтобы идти в «то» заявления и обработки следующей функции «слишком рано», мне нужно его ждать до первой функции завершенным.

Любые идеи?

ответ

0

Хорошо, я не мог найти способ сделать это, поэтому вместо этого я должен был установить переменную уровня фабрики (boolean), чтобы указать, когда была начата загрузка, тогда было установлено значение false, когда значение $ на событие было вызвано. В моем методе getLayerData я настраивал внутреннее число для запуска каждые 500 мс, внутри этой функции интервала я запускаю проверку для переменной загрузки, если false (т.е. загружен), а затем возвращает отложенное.resolve() и отменяет интервал.