
20.07.2015, 18:05
|
Новичок на форуме
|
|
Регистрация: 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.
|
|

20.07.2015, 19:15
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Samorez,
Наверно у ассинхронной функции есть свой callback, очевидно дальнейшее продвижение по дереву исполнений(внутри testData) , уже делать вызовом функции завершения(с тестом оставшихся) из callback первой ассинхронной
Либо складывать все результаты тестов в массив и тестировать длину всего массива(и завершения исполнения функции testData) через setInterval()
|
|

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

20.07.2015, 21:02
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Samorez,
Самое короткое складывать все результаты в массив, начиная с первой firstFunction(value), а оставшиеся операции выполнять из callback первой ассинхронной функции, а итоговый результ(массив) возвращать в общей callback функции, вызываемой в конце. Ну и обработку результата делать в ней же, вызываемую функцию конечной обработки результата мон давать параметром в testData(value,returnFun)
Это, если Ассинхронная функция единственная
Мон сделать каждое завершение событием, и тестировать полное выполнение (наличие полной длины массива проверок, либо ускоренное завершение, при наличии в массиве первочередных проверок в нужном порядке) по событиям.
Тупой вариант(правильно через addEventListener) - по завершению каждой проверки кликаем программно какой -нидь скрытый элемент, к примеру, кнопку и ставим в некий атрибут (data-array) элементы массива через запятушку.
И есть функция отслеживания клика на элементе, если массив в data-array заполнен полностью, или наличие первочередных проверок в нужном порядке(ускоренное завершение)- вычисляем итог
Последний раз редактировалось Deff, 20.07.2015 в 21:43.
|
|

20.07.2015, 21:04
|
 |
Профессор
|
|
Регистрация: 23.12.2013
Сообщений: 1,856
|
|
Цитата:
|
как модифицировать код, чтоб можно было узнать то, что действительно эта функция должна вернуть?!
|
Не совсем понял вопрос. Нужно сделать асинхронный код синхронным? Попробуй это https://learn.javascript.ru/promise
|
|

20.07.2015, 21:13
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Safort
|
Нужно сделать асинхронный код синхронным?
|
Я так понял минимизировать общее время выполнени функции при асинхронных внутренних функциях
|
|

20.07.2015, 21:29
|
Новичок на форуме
|
|
Регистрация: 20.07.2015
Сообщений: 4
|
|
Сообщение от Deff
|
Я так понял минимизировать общее время выполнени функции при асинхронных внутренних функциях
|
Спасибо, вариант что описали выше - хороший его и буду реализовывать.
Safort, promise-ы пришли только в последнем стандарате 2015 года и ,соответственно, поддержка старыми браузерами будет затруднена (без ралзичный шимов).
|
|

21.07.2015, 07:51
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Сообщение от Samorez
|
ответили граммотно
|
Я плакалъ.
Сообщение от Samorez
|
но как быть быть, если допустим firstFunction() яляется асинхронной?
|
Значит вывернуть testData() наизнанку и засунуть что получилось вызовом в зад firstFunction();
|
|

21.07.2015, 13:47
|
Новичок на форуме
|
|
Регистрация: 20.07.2015
Сообщений: 4
|
|
Сообщение от kostyanet
|
Я плакалъ.
Значит вывернуть testData() наизнанку и засунуть что получилось вызовом в зад firstFunction();
|
Рад, что вас так тронула тема, что аж заставила проселзиться.
|
|

22.07.2015, 12:13
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Это учебник 2032 года "Граммота по рускаву езыгу". Стопудово говорю вам к тому все идет.
|
|
|
|