Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как заставить скрипт дождаться выполнения асинхронной операции? (https://javascript.ru/forum/events/27705-kak-zastavit-skript-dozhdatsya-vypolneniya-asinkhronnojj-operacii.html)

SindBad 22.04.2012 11:00

Как заставить скрипт дождаться выполнения асинхронной операции?
 
Всем привет.
Есть в скрипте асинхронная операция, которая выглядит так:
var db = openDatabase("stor", "1.0", "stor data");
		db.transaction(function(tx) {
			tx.executeSql(
				"CREATE TABLE IF NOT EXISTS `stor` (`key` TEXT, `data` BLOB, unique(`key`))",
				[],
				function(tx, result){
					tx.executeSql('SELECT * FROM `stor`', [], function (tx, results){
					  var len = results.rows.length, i;
					  for (i = 0; i < len; i++) {
						storage[results.rows.item(i).key] = results.rows.item(i).data;
					  }
					});
					
				},
				function(tx, error){
					
				}
			);
		});

Ниже идёт проверка наличия элементов в массиве, но когда она запускается, цикл ещё не закончен, и соответственно, идёт потеря элементов, весь остальной код даёт сбои. Как "застопорить" скрипт, пока цикл не будет пройден?

razerxxx 22.04.2012 14:00

1. Вариант - оформить проверку элементов в функцию и запускать ее - сразу после цикла.
2. Вариант после цикла запускать событие. Гдето в коде отлавливать это событие и запускать проверку элементов.

SindBad 22.04.2012 16:57

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

razerxxx 22.04.2012 22:05

Цитата:

Сообщение от SindBad (Сообщение 170560)
Короче, определять перед проверкой окончание цикла.

не определять окончание цикла. А просле цикла запускать необходимые действия. У тебя сам цикл - синхронная операция.
Цитата:

Сообщение от SindBad (Сообщение 170560)
Дело в том, что проверка - это только начало, ниже будет очень много кода (заранее неизвестно, какого и сколько), включая инлайновые скрипты, и весь код зависит от результатов этой операции и результатов проверки. То есть, весь последующий javascript просто нереально запихать в условие или в обработчик.

Поэтому заранее нужно продумывать правильную архитектуру приложения. Вполне вероятно будут еще асинхронные вызовы, надо просто все правильно разложить по функциям.

SindBad 22.04.2012 22:13

Правильно - как?

razerxxx 22.04.2012 23:56

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


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