Javascript.RU

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

Основной поток и асинхронное выполнение
Здравствуйте, пишу функцию подобную этой:

function testData(value)
{
   if ( firstFunction(value)     )     return 1;    
   if ( secondFunction(value) )     return 2;  
   if ( thirdFunction(value)    )     return 3;
   return 0;
}

var a=testData("value");
alert(a);


и данный код работал бы отлично если все три функции вызываемые в testData - являлись бы обычными (синхронными).

но как быть быть, если допустим firstFunction() яляется асинхронной? как модифицировать код, чтоб можно было узнать то, что действительно эта функция должна вернуть?! Иначе корректность работы testData нарушается.

Обязательно сохранить при этом кроссбраузерность и IE 8+ поддержку.
Спасибо.

Последний раз редактировалось Samorez, 20.07.2015 в 18:09.
Ответить с цитированием
  #2 (permalink)  
Старый 20.07.2015, 19:15
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Samorez,
Наверно у ассинхронной функции есть свой callback, очевидно дальнейшее продвижение по дереву исполнений(внутри testData) , уже делать вызовом функции завершения(с тестом оставшихся) из callback первой ассинхронной
Либо складывать все результаты тестов в массив и тестировать длину всего массива(и завершения исполнения функции testData) через setInterval()
Ответить с цитированием
  #3 (permalink)  
Старый 20.07.2015, 20:46
Новичок на форуме
Отправить личное сообщение для Samorez Посмотреть профиль Найти все сообщения от Samorez
 
Регистрация: 20.07.2015
Сообщений: 4

Сообщение от Deff Посмотреть сообщение
Samorez,
Наверно у ассинхронной функции есть свой callback, очевидно дальнейшее продвижение по дереву исполнений(внутри testData) , уже делать вызовом функции завершения(с тестом оставшихся) из callback первой ассинхронной
Либо складывать все результаты тестов в массив и тестировать длину всего массива(и завершения исполнения функции testData) через setInterval()
Спасибо, ответили граммотно и по существу.
Думал, что возможно существует какой-то более красивая обертка нежели таймерами проверять длинну массива. по сути, ведь в зависимости от интервала таймера, мы можем потреять энное количество миллисекунд времени во время простоя. (как минимум 3 мс.. ведь минимальный таймер 4мс).
Быть может в jQ реализовали что-то более красивое на эту тему?
Ответить с цитированием
  #4 (permalink)  
Старый 20.07.2015, 21:02
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Samorez,
Самое короткое складывать все результаты в массив, начиная с первой firstFunction(value), а оставшиеся операции выполнять из callback первой ассинхронной функции, а итоговый результ(массив) возвращать в общей callback функции, вызываемой в конце. Ну и обработку результата делать в ней же, вызываемую функцию конечной обработки результата мон давать параметром в testData(value,returnFun)
Это, если Ассинхронная функция единственная

Мон сделать каждое завершение событием, и тестировать полное выполнение (наличие полной длины массива проверок, либо ускоренное завершение, при наличии в массиве первочередных проверок в нужном порядке) по событиям.
Тупой вариант(правильно через addEventListener) - по завершению каждой проверки кликаем программно какой -нидь скрытый элемент, к примеру, кнопку и ставим в некий атрибут (data-array) элементы массива через запятушку.
И есть функция отслеживания клика на элементе, если массив в data-array заполнен полностью, или наличие первочередных проверок в нужном порядке(ускоренное завершение)- вычисляем итог

Последний раз редактировалось Deff, 20.07.2015 в 21:43.
Ответить с цитированием
  #5 (permalink)  
Старый 20.07.2015, 21:04
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

Цитата:
как модифицировать код, чтоб можно было узнать то, что действительно эта функция должна вернуть?!
Не совсем понял вопрос. Нужно сделать асинхронный код синхронным? Попробуй это https://learn.javascript.ru/promise
Ответить с цитированием
  #6 (permalink)  
Старый 20.07.2015, 21:13
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от Safort
Нужно сделать асинхронный код синхронным?
Я так понял минимизировать общее время выполнени функции при асинхронных внутренних функциях
Ответить с цитированием
  #7 (permalink)  
Старый 20.07.2015, 21:29
Новичок на форуме
Отправить личное сообщение для Samorez Посмотреть профиль Найти все сообщения от Samorez
 
Регистрация: 20.07.2015
Сообщений: 4

Сообщение от Deff Посмотреть сообщение
Я так понял минимизировать общее время выполнени функции при асинхронных внутренних функциях
Спасибо, вариант что описали выше - хороший его и буду реализовывать.

Safort, promise-ы пришли только в последнем стандарате 2015 года и ,соответственно, поддержка старыми браузерами будет затруднена (без ралзичный шимов).
Ответить с цитированием
  #8 (permalink)  
Старый 21.07.2015, 07:51
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Samorez
ответили граммотно
Я плакалъ.

Сообщение от Samorez
но как быть быть, если допустим firstFunction() яляется асинхронной?

Значит вывернуть testData() наизнанку и засунуть что получилось вызовом в зад firstFunction();
Ответить с цитированием
  #9 (permalink)  
Старый 21.07.2015, 13:47
Новичок на форуме
Отправить личное сообщение для Samorez Посмотреть профиль Найти все сообщения от Samorez
 
Регистрация: 20.07.2015
Сообщений: 4

Сообщение от kostyanet Посмотреть сообщение
Я плакалъ.




Значит вывернуть testData() наизнанку и засунуть что получилось вызовом в зад firstFunction();
Рад, что вас так тронула тема, что аж заставила проселзиться.
Ответить с цитированием
  #10 (permalink)  
Старый 22.07.2015, 12:13
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Это учебник 2032 года "Граммота по рускаву езыгу". Стопудово говорю вам к тому все идет.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jq ajax jsonp отключить асинхронное выполнение defender057 AJAX и COMET 6 27.06.2013 10:51
Как остановить выполнение яваскрипта ? Serjuk AJAX и COMET 20 17.06.2012 22:32
Пошаговое выполнение кода KamalovRadik jQuery 2 28.10.2011 20:46
Асинхронное выполнение скриптов в HTML RUVATA Общие вопросы Javascript 6 15.08.2011 13:34
Фоновое выполнение JS-кода snake32 Общие вопросы Javascript 3 04.07.2011 18:25