Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.03.2013, 07:30
Новичок на форуме
Отправить личное сообщение для PavelX Посмотреть профиль Найти все сообщения от PavelX
 
Регистрация: 03.03.2013
Сообщений: 3

Выполнение асинхронных функций
Доброго времени суток,

Проконсультируйте, пожалуйста, по работе асинхронных функций.
Использую асинхронную API функцию с callback-ом, в котором добавляю один элемент в массив. После нескольких вызовов этой функции массив должен полностью заполниться и быть отправленным с помощью ajax-запроса на другой php-скрипт.
Проблема в том, как сделать чтобы ajax-запрос отсылался только после заполнения массива.
Решил использовать следующий подход (для массива из N элементов):
Массив data - глобальный.
apiasynfunc( function(result){
           data.push(result);
             if(data.length==NUM) ajax-запрос;
          };
apiasynfunc( function(result){
           data.push(result);
             if(data.length==NUM) ajax-запрос;
          };


Таким образом, ajax-запрос будет отправлен только после добавления последнего элемента ( либо из первого callback-а, либо из второго - в зависимости от скорости отработки API-функции).

Вопрос:
Может ли быть такое, что в первом коллбэке элемент добавится в массив, затем по прерыванию еще один элемент добавиться из-за второго коллбэка и во втором коллбэке будет сделан аякс-запрос , после чего управление передастся в первый коллбэк и там тоже будет произведен аякс-запрос?


Судя по просмотру темы
Асинхронный вызов толстых функций
работа функции никак не прерывается, но не полностью разобрался с асинхронными вызовами и потому сомневаюсь.

Буду очень благодарен за ссылку на доступные материалы о механизме асинхронных вызовов.

Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 03.03.2013, 07:55
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

В один момент времени выполняется только один участок кода. Поэтому нет, не может.
Ответить с цитированием
  #3 (permalink)  
Старый 03.03.2013, 08:04
Новичок на форуме
Отправить личное сообщение для PavelX Посмотреть профиль Найти все сообщения от PavelX
 
Регистрация: 03.03.2013
Сообщений: 3

Сообщение от danik.js
В один момент времени выполняется только один участок кода. Поэтому нет, не может.
Спасибо, но что понимается под "участком кода" - это функция?
Ответить с цитированием
  #4 (permalink)  
Старый 03.03.2013, 08:08
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

ну да
Ответить с цитированием
  #5 (permalink)  
Старый 03.03.2013, 08:14
Новичок на форуме
Отправить личное сообщение для PavelX Посмотреть профиль Найти все сообщения от PavelX
 
Регистрация: 03.03.2013
Сообщений: 3

И асинхронность (внешних API-функций или обработка ajax-запросов) не предполагает многопоточности - видимо все функции выполняются последовательно, а переключение между ними происходит по прерываниям?
Ответить с цитированием
  #6 (permalink)  
Старый 03.03.2013, 14:04
Аватар для simple
Профессор
Отправить личное сообщение для simple Посмотреть профиль Найти все сообщения от simple
 
Регистрация: 23.09.2010
Сообщений: 247

в node функция nextTick(fn), если по простому объяснять то при ее вызове fn ставится в очередь и ее выполнение откладывается до следующего витка цикла.
Ответить с цитированием
  #7 (permalink)  
Старый 04.03.2013, 15:14
Аватар для keen
Профессор
Отправить личное сообщение для keen Посмотреть профиль Найти все сообщения от keen
 
Регистрация: 28.03.2012
Сообщений: 376

вот только что в соседнем топике в который раз рекомендовал библиотеку async.
тут тоже можно всё упростить с её помощью.
условно говоря:
async.parallel([
    funcPushArray(0),
    funcPushArray(1),
    funcPushArray(2),
..
    funcPushArray(n),
], function (e) {
    if (e) {
        someAlert(e);
        return;
    }
    funcDoAjax();
});

с помощью funcPushArray заполняете массив (при этом эти ф-ии выполняются параллельно), по завершении всех этих ф-ий выполнится funcDoAjax().
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятный алгоритм отработки функций Jopses jQuery 5 16.02.2013 12:55
Как остановить выполнение яваскрипта ? Serjuk AJAX и COMET 20 17.06.2012 22:32
Паралельное выполнение 2х функций BorodinKO Общие вопросы Javascript 4 24.01.2012 14:15
Пошаговое выполнение кода KamalovRadik jQuery 2 28.10.2011 20:46
Как получить список пользовательских функций объекта window? Маэстро Events/DOM/Window 13 03.07.2010 13:20