Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> дождаться callback не выходя из процедуры. 
V
    Опции темы
CompWorm
  Дата 30.8.2013, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



общая идея - перед закрытием окна браузера дождаться завершения работы внешнего приложения  (плагин, в моем случае VLC), 
которое оповещает нас o своем состоянии CallBack`ами.

для упрощения примера, CallBack будет дергать таймер :
Код

status = "busy...";

// CallBack
function finishWork()
{
    status = "I'm done!";
}

window.onbeforeunload = function(evt)
{
    window.setInterval(function(){finishWork()},10000);         // сообщить  о готовности через 10 секунд 

    while (status == "busy...")  // ждать изменения статуса готовности 
    {
        goSleep(100);
    }

// после выхода окно браузера закроется,
// выходить раньше получения нужного статуса нельзя.
}

function goSleep(delay)
{
    var now = new Date().getTime();
    var desiredTime = now + delay;

    while (now < desiredTime) {
        now = new Date().getTime();
    }
}

если это дебажить, то мы увидим, что callBack finishWork() вызван пока мы в цикле сидим, но значение статуса остается прежним, пока не завершица процедура. 
цикл будет вечным.

ничего нового в этом нет, такая проблема например в Delphi решается через Application.ProcessMessages() или в VB Application.DoEvents для синхронизации параллельных вызовов,
однако в JavaScript этого нет.

собственно, как быть? smile 

Это сообщение отредактировал(а) CompWorm - 30.8.2013, 21:17


--------------------
PM MAIL   Вверх
Arantir
Дата 30.8.2013, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 14
Всего: 55



Не совсем понял, суть в том, чтобы закрытие окна не просто отменилось, а все равно произошло, но чуть позже?


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
CompWorm
Дата 30.8.2013, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



Цитата(Arantir @  30.8.2013,  19:23 Найти цитируемый пост)
суть в том, чтобы закрытие окна не просто отменилось, а все равно произошло, но чуть позже

да. 

в моем случае, перед закрытием окна я говорю VLC плееру "останови видео" и жду в цикле пока он остановить видео. 
об окончании процесса остановки он сообщает через callback.
вот крутясь в цикле я должен узнать как-то что callback сработал...

Добавлено @ 21:07
проблема в общем смысле в том, что в Javascript есть только один поток, и если в процессе выполнения процедуры произошел параллельный вызов другой процедуры, то первая об этом не знает.


Это сообщение отредактировал(а) CompWorm - 30.8.2013, 21:08


--------------------
PM MAIL   Вверх
Arantir
Дата 30.8.2013, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 14
Всего: 55



Судя по возможностях, что дарованы разработчику, все должно быть как-то так:
Код

window.onbeforeunload = function(evt) {
    if (status == "busy") {
        return "На странице есть активные задачи. Вы уверены, что хотите уйти?";
    }
}
 smile 


В goSleep(delay) проблема в том, что:
а) поток будет так занят, что окно/вкладка с этим скриптом просто зависнет
б) браузер остановит это дело и принудительно выйдет изо все функций, вкладка благополучно закроется
в) браузер просто убьет выполнение скрипта из-за излишней нагрузки


Можно было бы поиграться с window.close(), но в большинстве браузеров уже пофиксили самые изощренные попытки закрыть окно, открытое со ссылки, а не со скрипта. Хром даже не выводит окошка с вопросом.

Закрывание окон — вообще больная тема последним временем... 

А чем нежелательно закрытие окна до остановки видео? Может это можно решить на другом уровне...


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
CompWorm
  Дата 3.9.2013, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



Цитата(Arantir @  30.8.2013,  22:42 Найти цитируемый пост)

В goSleep(delay) проблема в том, что:
а) ...
б) ...
в) ...

я в курсе. две точки синхронизации вызовов на единственном потоке - это до входа в window.onbeforeunload и после, при том промежуточные вызовы типа goSleep ни на что не влияют, фактически браузер зависает на время выполнения каждого вызова. в этом и состоит проблема.

ОФТОП:
Цитата(Arantir @  30.8.2013,  22:42 Найти цитируемый пост)
А чем нежелательно закрытие окна до остановки видео? Может это можно решить на другом уровне... 

исходная суть задачи - по таймеру, асинхронно, менять видео в нескольких VLC на одной закладке браузера. 
опробовано два подхода:
1) рассувать плееры, каждый в свой iframe, по таймеру динамически переоткрывать iframe с новым плеером, с новым адресом потока.
это вызывает падение VLC по рейс-кондишан, как я считаю, то есть во время долгой буферизации в нескольких плеерах по таймеру может поспеть переоткрытие ifram'а.
в такой форме мне этот код торжественно вручили на доработку))) 
собственно, я выяснил, что без видео эти ifram'ы с vlc закрываются без падений, и идея починки была в том, чтобы отправить плееру стоп перед закрытием его iframa, дожидаться события кол-бэка, что он стопнут и закрыть окно. 
это я выше и описал.

2) второй вариант казалось бы более разумный - загрузить готовый плейлист в каждый VLC и переключать потоки по таймеру, не убивая VLC каждый раз. 
вариант многообещающий, к тому же так проще заинтегрировать события по колбэкам, но к сожалению, это не спасает от падения, если опять-таки закрыть окно с этими плеерами. особенно, если один из плееров буферизирует поток или останавливает поток в этот момент.

я не знаю, честно говоря, как управляется память в javascript, но не исключаю и другой рейс-кондишан - окно ifram'a или браузера закрылось, а плеер всё ещё в памяти сидит и закрывается, пока его гарбидж коллектор не прибьёт, внезапно обнаружив, что сылок на dll ки от vlc больше нет... произойти это может не скоро, так как другие плееры всё ещё показывают видео, стало быть либы всё ещё используются, тогда происходит не падение, а утечка памяти. утечку памяти при остановки плееров я часто наблюдаю в FireFox. 
ещё раз, это моя догадка, поправьте, если кто точно знает как управляется память при использовании плагинов.

то есть оба варианта требуют ловить события перед закрытием окна.

Добавлено через 5 минут и 29 секунд
Цитата(Arantir @  30.8.2013,  22:42 Найти цитируемый пост)
return "На странице есть активные задачи. Вы уверены, что хотите уйти?";

это не серьёзно. приложение должно завершаться самостоятельно, не оповещая пользователя о своих проблемах в коде. smile 


--------------------
PM MAIL   Вверх
CompWorm
  Дата 3.9.2013, 04:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



а! был третий вариант!
3) хранить в главном окне хэндлиры на все VLC'ы, посылать каждому стоп и ждать колбэка в основном окне. 
по получении отклика - переключаться на следующий поток (или переоткрыть iframe). 
идея очень многообещающая, но с треском провалилась, ибо я не осилил поиск объекта внутри ifram'а, пишет что access denied. судя по гуглу, что-то надо крутить в настройках http у сервера. smile но это уже совсем отдельная тема. smile 


--------------------
PM MAIL   Вверх
akizelokro
Дата 4.9.2013, 15:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 2
Всего: 5



Цитата(CompWorm @  30.8.2013,  19:14 Найти цитируемый пост)
ничего нового в этом нет, такая проблема например в Delphi решается через Application.ProcessMessages() или в VB Application.DoEvents для синхронизации параллельных вызовов,
однако в JavaScript этого нет.


Не совсем верное утрверждение.
WebWorker пробовал?


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
CompWorm
Дата 4.9.2013, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



akizelokro, о, не знал, спасибо за попытку - плюс в репу!
но у меня к сожалению, требование заказчика - IE9, а поддерживается web Worker начиная с IE10  smile 
кроме того, я не уверен, что получу событие от WebWorker не выходя из window.onbeforeunload ...

есть еще какие-нибудь идеи?

Это сообщение отредактировал(а) CompWorm - 4.9.2013, 18:54


--------------------
PM MAIL   Вверх
akizelokro
Дата 5.9.2013, 05:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 2
Всего: 5



За "репу" спасибо!
Ситуация у тебя здесь аховая. Закрытие страниицы производить только основываясь на том, что плагин доработает (остановится как честный человек, - полагаться можно, но не нужно). Плагин можт крякнуться и из-за другого окна и по другим причинам. В этом случае отзыва ты от него не дождёшься никогда. Имхо, нужен определенный таймаут, для того, чтобы он отозвался. Если он не отозвался за достаточное время, то считать его выбывшим из строя.

Проблемe со всякими таймаутами, которые в JavaScript реализуются со своими особенностями, я решаю просто. Пишу php-скрипт, который делает задержку на несколько секунд, делаю ajax вызов этого скрипта и даже потом ответ не читаю, и проверяю то, что мне надо. Решение криво своеобразное, согласен. Но с JavaScript иных не вижу.


Код

function sleep(seс)
{
    $.ajaxSetup({async:false});
    $.post('sleep.php',
    {'seс':seс},    
    "html");          
}



Это сообщение отредактировал(а) akizelokro - 5.9.2013, 05:48


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
CompWorm
Дата 6.9.2013, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



Цитата(akizelokro @  5.9.2013,  05:44 Найти цитируемый пост)
$.

к сожалению у нас dojo вместо jquery... внезапно. smile 
ладно, в целом можно считать проблему решенной, вектор движения обозначен, дальше сам пойду изобретать.
Всем спасибо за участие. 




--------------------
PM MAIL   Вверх
akizelokro
Дата 6.9.2013, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 2
Всего: 5



Ну, и поправлюсь. Не "решаю просто", а когда решить их иначе нельзя. 
 smile  Есть, к примеру, заказчик, и хочет невозможного. Как потом оказывается. Потому что ТЗ делаются на несколько дней работы чаще всего, все детали порой не прорабатываются.. Я не заполоняю этими sleep.php свою работу. Но приходит момент и, по-другому, получается, что и нельзя. Убейся, но сделай. Тогда и приходится.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
CompWorm
Дата 6.9.2013, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: нет
Всего: 31



Цитата(akizelokro @  6.9.2013,  15:12 Найти цитируемый пост)
Я не заполоняю этими sleep.php свою работу. Но приходит момент и, по-другому, получается, что и нельзя. Убейся, но сделай. 

наш случай )))


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.