2017-02-08 4 views
0

У меня есть проект Angularjs, который использует Restangular для доступа к базе данных. У меня есть три уровня данных (например, mydata, mysubdata, mysubsubdata), и между каждым слоем существует соотношение «один ко многим». Моя проблема в том, что для моего отображения мне нужно объединить mysubsubdata в mysubdata. Когда я пытаюсь получить данные из базы данных, я получаю жалобу в компиляторе, который говорит, что я не могу иметь функцию в цикле. Вот что я пытаюсь сделать:Как использовать функцию внутри цикла внутри .then?

DataService.one(mydata.id).getList('mysubdata') 
.then(function(data) { 
    var dataList = data; 
    for (returnedData in dataList) { 
    DataService.one(mydata.id).one('mysubdata',returnedData.id).getList('mysubsubdata') 
    .then(returnedSubData) { 
     dataList = angular.extend(dataList, returnedSubData); 
    }); 
    } 
}); 

Все примеры, которые я нашел бы петли внутри .then функции или пытаются получить кучу обещаний назад первый. Я не думаю, что они применяются. Я все еще довольно новичок в Angular, поэтому я могу немного подпрыгнуть. Не уверен также в продлении, но это, вероятно, отдельный вопрос.

Редактировать: Я подозреваю, что это должно быть сделано с помощью $ q.all, но еще не поняло метод.

+0

С моей точки зрения, вам нужно вернуть 'обещание', чтобы использовать' then' – jdmdevdotnet

+0

Чтобы уточнить, DataService использует Restangular и делает это. Первая часть (до второго DataService) работает нормально. Извините, что не объяснил это. –

+0

Вы пытались сделать замыкание внутри цикла? –

ответ

0

Добавление метода then() внутри вашей петли не будет работать из-за простой причины, по которой этот цикл не дождался разрешения обещаний. Вы можете добиться этого с помощью рекурсивного метода.

var myCustomData = null, 
    dataList = null, 
    dataListCounter = 0; 

DataService.one(mydata.id).getList('mysubdata') 
    .then(function (data){ 
    dataList = data; 
    myCustomData = mydata; 
    $scope.getSubSubData(); 
}); 

$scope.getSubSubData = function() { 
    if (dataList.length >= dataListCounter) 
    return; 
    DataService.one(myCustomData.id).one('mysubdata',dataList[dataListCounter].id).getList('mysubsubdata') 
    .then(function (returnedSubData) { 
     dataList = angular.extend(dataList, returnedSubData); 
     dataListCounter++; 
     $scope.getSubSubData(); 
    }); 
}; 

Пожалуйста, дайте мне знать, если это поможет!

+0

Кажется, я представил ошибку в вызове DataService, поэтому я исправляю это. Я пытаюсь ответить. Заметьте, мне пришлось добавить фигурные скобки к if. –

+0

Это еще не работает. Кажется, что кусок getSubSubData не вызван. Когда я перехожу через него, похоже, что строка getSubSubData попадает, но точка останова внутри функции никогда не попадает. Обратите внимание, что этот код находится внутри службы, а не контроллера. –

+0

Можете ли вы предоставить скрипку? –

0

Незначительные исправления к ответу @Anadi Sharma.

$scope.getSubSubData = function() { 
    if (dataList.length == dataListCounter) 
    return; 
    DataService.one(myCustomData.id).one('mysubdata',dataList[dataListCounter].id).getList('mysubsubdata') 
    .then(function (returnedSubData) { 
     dataList[dataListCounter].mysubsubdata = returnedSubData; 
     dataListCounter++; 
     $scope.getSubSubData(); 
    }); 
}; 

Обратите внимание, что затем я использую фильтр, когда я отображаю данные, чтобы объединить значения subsubdata.

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