Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Дождаться завершения функции и продолжить выполнение кода (https://javascript.ru/forum/events/46452-dozhdatsya-zaversheniya-funkcii-i-prodolzhit-vypolnenie-koda.html)

XRASER 10.04.2014 15:02

Дождаться завершения функции и продолжить выполнение кода
 
В моем коде выполняется функция, но необходимо ее дождаться, только после этого продолжить выполнение кода, как это сделать?

Для примера написал такой простенький код, чтобы было легче с ним работать:
function func()
{
    setTimeout('n=1', 2000); // Задержка 2 секунды, для примера.
}

var n = 0;
alert ("Начали");
func();
alert("Закончили. Результат = " + n + ".");

Добавить bool переменные и чекать их - долго и нудно.
Добавлять setTimeout больше чем 2 секунды на вывод ответа - бессмысленно.

dmitriymar 10.04.2014 15:15

обрамить весь оставшийся код в функцию , и вызывать её в конце вызываемой в асинхроне функции . Соответственно
'n=1'
перенести в функцию и в таймере вызывать её.
А ну и ещё - 'n=1' === eval( 'n=1') по дефолту

Цитата:

Сообщение от XRASER
Добавить bool переменные и чекать их - долго и нудно.

- ты в меньшенстве кто так считает. Всему своё место, и не диктуется такими понятиями, как долго, нудно. Архитектурой диктуется и целями

XRASER 10.04.2014 15:32

function func()
{
    setTimeout('n=1', 2000); // Задержка 2 секунды, для примера.
    func2();
}

function func2()
{
    alert("Закончили. Результат = " + n + ".");
}

var n = 0;
alert ("Начали");
func();


Ничего не изменилось. А можно ли сделать так, чтобы код всегда выполнялся синхронно?

Octane 10.04.2014 15:35

Думаю уже можно советовать использовать Promise, нативная поддержка есть в Firefox и Chrome
new Promise(function (resolve) {

	alert("Начали");

	setTimeout(function () {

		resolve(1);

	}, 1000)

}).then(function (value) {

	alert("Закончили. Результат = " + value + ".");

});
для старых браузеров и IE можно подключить полифил https://github.com/jakearchibald/es6-promise

Либо делай, как сказал dmitriymar: «обрамить весь оставшийся код в функцию, и вызывать её в конце вызываемой в асинхроне функции»
var n = 0;

function func() {
	setTimeout(function () {
		n = 1;
		callback();
	}, 2000); // Задержка 2 секунды, для примера.
}

function callback() {
	alert("Закончили. Результат = " + n + ".");
}

alert("Начали");
func();

XRASER 10.04.2014 15:39

Цитата:

Сообщение от Octane (Сообщение 307118)
Думаю уже можно советовать использовать Promise, нативная поддержка есть в Firefox и Chrome
new Promise(function (resolve) {

	alert("Начали");

	setTimeout(function () {

		resolve(1);

	}, 1000)

}).then(function (value) {

	alert("Закончили. Результат = " + value + ".");

});
для старых браузеров и IE можно подключить полифил https://github.com/jakearchibald/es6-promise

Либо делай, как сказал dmitriymar: «обрамить весь оставшийся код в функцию, и вызывать её в конце вызываемой в асинхроне функции»
var n = 0;

function func() {
	setTimeout(function () {
		n = 1;
		callback();
	}, 2000); // Задержка 2 секунды, для примера.
}

function callback() {
	alert("Закончили. Результат = " + n + ".");
}

alert("Начали");
func();

Спасибо большое, второй пример понятен, буду использовать его.


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