powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JavaScript синхронность/асинхронность
13 сообщений из 13, страница 1 из 1
JavaScript синхронность/асинхронность
    #39160920
Boksy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста что-то никак не могу разобраться, JavaScript, есть асинхронная функция, которая выполняет какие-то действия, есть массив элементов, как пустить цикл по элементам, чтобы был синхронный, чтобы обработка нового элемента не начиналась, пока не обработается предыдущий
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39160929
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без кода это пустой набор слов.
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39160945
Zoria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BoksyПодскажите пожалуйста что-то никак не могу разобраться, JavaScript, есть асинхронная функция, которая выполняет какие-то действия, есть массив элементов, как пустить цикл по элементам, чтобы был синхронный, чтобы обработка нового элемента не начиналась, пока не обработается предыдущий
из колбэка вызывать функцию для следующего эелемента?
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39160958
Фотография бухалтер фантоцци
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Boksy,

JS-код сам по себе асинхронный (callback - функции это один из китов JavaScript),
и JavaScript - это однопоточное приложение (если не используются воркеры).

Если обработка очередного элемента массива слишком тяжела, что приходится разносить операции по шагам (или использовать воркеры), или данные приходят через AJAX-запросы,
то обработчики событий плюс callback-функции решают задачу.
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39160991
Boksy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
function start() {
  async_fun(0).then(function () {
	return async_fun(1);
  }).then(function () {
	return async_fun(2);
  });
}

function async_fun(index) {
	return loadData(index).then(function (data) {
		return actionOnData(data);
	});
}

function actionOnData(data) {
        некоторая работа с data
        return actionOnData2(data, false);
}

function actionOnData2(data, flag) {
	return getData().then(function (data2) {
		if(!flag) {
			return actionOnData2(data, true);
		}
		какие-то действия
	});
}



примерная структура.
попробую пояснить 1) вызывется функция start(), в ней необходимо поочередно пробежаться по элементам и вызвать для каждого actionOnData (если использовать колбеки то работает, но можно ли сделать это в цикле, просто неизвестно число элементов?)
2) данные передаются в actionOnData, там обрабатываются данный и грузятся часть данных
3) поподаем в actionOnData2, там догружаются данные гружаются в зависимости от флага(для упращение примера флаг сразу false),
в случае flag = false; вызываем actionOnData2 с другим флагом (ту синхронность теряется и совместно с текущим элементов, начинает выполняться следующий элемент)

Надеюсь хоть как-то понятно
Вопросы в следующем, как сделать цикл (чтобы можно было обработывать динамическое кол-во), и как не терять синхронность в пункте 3
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39161029
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Boksy,

Брэд какой-та ))

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

тогда цепочка вызовов будет выглядеть так:
Основная функция для элемента 1
--Обработчик1
--Обработчик2
--Обработчик3
--Регистрация отложенного вызова основной функции для элемента 2
Основная функция для элемента 2
--Обработчик1
--Обработчик2
--Обработчик3
--Регистрация отложенного вызова основной функции для элемента 3
...


P.S. Регистрация отложенного вызова осуществляется командой setTimeout(func, 0)
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39162046
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть массив элементов, как пустить цикл по элементам, чтобы был синхронный, чтобы обработка нового элемента не начиналась, пока не обработается предыдущий

может не так понял, но если имелось ввиду последовательная обработка массива асинхронными функциями, то примерно так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    function start(arr) {
     var sequence = Promise.resolve();
      arr.forEach(function (elem, index) {
        sequence = sequence.then(function () {
          return async_fun(index);
          //return async_fun(index).then(...
        })
      });
      return  sequence;
    }
    start([0,1,2]).then(function(){
      ;
    }).catch(function(){
      ;
    })
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
JavaScript синхронность/асинхронность
    #39524717
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток,

У меня похожий вопрос, поэтому не стал создавать новую тему.
Начну с кодов:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
function getData1(callback) {
    var response = [];
    $.ajax({
        url: 'url1',
        type: 'post',
        contentType: 'application/json;charset=UTF-8',
        data: '..',
        timeout: 500,
        success: function (result) {
            response = result;
            callback(response)
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert('Error in ...');
        },
        complete: function(){
        }
    });
}


function getData2(callback) {
    var response = [];
    $.ajax({
        url: 'url2',
        type: 'post',
        contentType: 'application/json;charset=UTF-8',
        data: '..',
        timeout: 500,
        success: function (result) {
            response = result;
            callback(response)
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert('Error in ...');
        },
        complete: function(){
        }
    });
}

function crOb(s_name){
    var d = $.Deferred();
    switch (s_name) {
        case 'list1': {
            getData1(function(resdata){
                ...
            });
            }
            break;
        case 'list2': {
            getData2(function(resdata){
            });
            }
            break;
        default: {
            alert("Неизвестный парам="+s_name);
        }
    }
    return d.resolve();
}

crOb('List1');
crOb('List2');
document.location = "new url";


Мне надо чтобы строка
Код: javascript
1.
      document.location = "new url";


выполнилась после завершения выполнения этих строк:
Код: javascript
1.
2.
crOb('List1');
crOb('List2');



Я попробовал так, но результат отрицательный.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var d1;
var d2;

d1 = crOb('List1');

$d1.done(function() {
	d2 = crOb('List2');
});
$d2.done(function() {
      document.location = "new url";
});


Подскажите пожалуйста, как организовать поочередное выполнение функций ?
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39524832
Фотография user89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gabit,

я делал через рекурсию, примерно как здесь http://savvateev.org/blog/30/
На эту статью вышел через гугл javascript последовательно аякс по очереди
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39524848
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GabitМне надо чтобы строка
Код: javascript
1.
      document.location = "new url";


выполнилась после завершения выполнения этих строк:
Код: javascript
1.
2.
crOb('List1');
crOb('List2');



Она так и выполнится...
Но тебе видать нужно выполнить ее после получения обоих ответов на запросы. А это уже другое дело!

Как вариант:
- завести счетчик в котором будет увеличиваться число ответов на запросы
- при получении ответа увеличивать счетчик на единицу
- после запуска запросов запустить setTimeout(), который будет проверять тот счетчик
- если количество ответов устраивает, выполнить переход
- если мало, продолжить ожидание
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39524850
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user89я делал через рекурсию
Рекурсия при разнопоточных событиях не помощник.
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39524855
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user89я делал через рекурсию, примерно как здесь http://savvateev.org/blog/30/
авторрекурсивно, через callback функцию
У людей какое-то странное понимание рекурсии. Вот несколько определений рекурсии
автор Реку́рсия — определение, описание, изображение какого-либо объекта или процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя. Термин «рекурсия» используется в различных специальных областях знаний — от лингвистики до логики, но наиболее широкое применение находит в математике и информатике.
https://ru.wikipedia.org/wiki/Рекурсия
авторЧастный случай подвызова – когда функция вызывает сама себя. Это называется рекурсией .
https://learn.javascript.ru/recursion

По твоей ссылке нет никакого вызова самой себя. Есть простая передача себя в калбек другой функции для асинхронного вызова.
Т.е. сама функция уже отработала, стек уменьшился. Т.о. никакой рекурсии нет и в помине.

В том примере запросы выполняются по очереди. У автора они запущены одновременно. Т.е. пример не корректен.
...
Рейтинг: 0 / 0
JavaScript синхронность/асинхронность
    #39524941
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял то подойдёт обычноt^
Код: javascript
1.
$.when(crOb('List1'), crOb('List2')).then(function(){document.location = "new url";})



Сам никогда так не делал, но в документации написано что сработает. Только не забудьте из crOb вернуть ajax объекты. То есть перед $.ajax... поставить return и всё такое...

И Вы сильно усложнили структуру... разные там deferred и resolve в данном случае лишние.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JavaScript синхронность/асинхронность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]