Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как правильно совместить цикл for с "then(function(){})" (https://javascript.ru/forum/misc/67126-kak-pravilno-sovmestit-cikl-s-then-function-%7B%7D.html)

vell174 29.01.2017 15:40

Как правильно совместить цикл for с "then(function(){})"
 
Здравствуйте, помогите как совместить цикл for с then.
Нужно вытащить из базы данных IndexDB с разными ключами, и совместить их в один массив но проблема в том что цикл идет и не дожидается ответа и получается каша.

Вот код:
var i=0,
len=$rootScope.core_save_http[1].length;
for(; i < len; i++) {
         $localForage.getItem(''+$rootScope.core_save_http[1][i][0]+'').then(function(data) {
                    $rootScope.core_save_http[1][i][1]=data;
        });
                           }


Использую AngularJS 1.6

destus 29.01.2017 17:21

vell174,
что ты подразумеваешь под словом "каша" ?

vell174 29.01.2017 18:16

Решил данную проблему сам.. Сделал следущие каму интересно.

Создаем фабрику:

.factory('core_https_push', ['$rootScope', '$q', '$localForage', function ($rootScope, $q, $localForage) {
			return {
				get : function (param,id_http,index_select) {
					var deferred = $q.defer();

					
					function myLoop(i) {
					if(i==-1)
					{
						return deferred.resolve(true);
					}
		
					$localForage.getItem($rootScope.core_save_http[1][i][0]).then(function(data) {
						$rootScope.core_save_http[1][i][1]=data;
						return myLoop(i-=1);
					});
						
					}
					myLoop($rootScope.core_save_http[1].length-1);
					

						

				
					return deferred.promise;
				}
			}
		}
])


Вызываем функцию из контроллера:
core_https_push.get().then(function(promes) {
	alert(promes);
});

destus 29.01.2017 18:26

Эммм, ну хорошо.

На самом деле тут все можно решить в 5 строчек, составлением из $rootScope.core_save_http[1] массива промисов и пробросом его в Promise.all. Ну или в $q.all().then()


Часовой пояс GMT +3, время: 22:08.