Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JavaScript синхронность/асинхронность / 13 сообщений из 13, страница 1 из 1
02.02.2016, 11:56
    #39160920
Boksy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaScript синхронность/асинхронность
Подскажите пожалуйста что-то никак не могу разобраться, JavaScript, есть асинхронная функция, которая выполняет какие-то действия, есть массив элементов, как пустить цикл по элементам, чтобы был синхронный, чтобы обработка нового элемента не начиналась, пока не обработается предыдущий
...
Рейтинг: 0 / 0
02.02.2016, 12:07
    #39160929
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaScript синхронность/асинхронность
без кода это пустой набор слов.
...
Рейтинг: 0 / 0
02.02.2016, 12:19
    #39160945
Zoria
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaScript синхронность/асинхронность
BoksyПодскажите пожалуйста что-то никак не могу разобраться, JavaScript, есть асинхронная функция, которая выполняет какие-то действия, есть массив элементов, как пустить цикл по элементам, чтобы был синхронный, чтобы обработка нового элемента не начиналась, пока не обработается предыдущий
из колбэка вызывать функцию для следующего эелемента?
...
Рейтинг: 0 / 0
02.02.2016, 12:29
    #39160958
бухалтер фантоцци
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaScript синхронность/асинхронность
Boksy,

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

Если обработка очередного элемента массива слишком тяжела, что приходится разносить операции по шагам (или использовать воркеры), или данные приходят через AJAX-запросы,
то обработчики событий плюс callback-функции решают задачу.
...
Рейтинг: 0 / 0
02.02.2016, 12:56
    #39160991
Boksy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaScript синхронность/асинхронность
Код: 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
02.02.2016, 13:39
    #39161029
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaScript синхронность/асинхронность
Boksy,

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

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

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


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

может не так понял, но если имелось ввиду последовательная обработка массива асинхронными функциями, то примерно так:
Код: 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
Период между сообщениями больше года.
22.09.2017, 11:10
    #39524717
Gabit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaScript синхронность/асинхронность
Доброе время суток,

У меня похожий вопрос, поэтому не стал создавать новую тему.
Начну с кодов:
Код: 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
22.09.2017, 13:07
    #39524832
user89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaScript синхронность/асинхронность
Gabit,

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


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



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

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

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

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



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

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


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