Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ProcessMessages (https://javascript.ru/forum/misc/1609-processmessages.html)

Autosof 23.08.2008 18:12

ProcessMessages
 
Вопрос к более знающим и понимающим.

Как в javascript реализовать что-то наподобие Application.ProcessMessages в Dephi. На мой взгляд, использование такого механизма очень удобно.

Например, используя Ajax нужно отлавливать события завершения процесса передачи данных, а значит нужно объявлять дополнительные функции-обработчики. Если таких запросов много то и функций-обработчиков, как правило, тоже много. А чем больше программного кода, тем сложнее в него впоследствии вносить изменения и вообще сопровождать. Это правило, к сожалению, никто не отменял. Конечно, можно выполнять запросы асинхронно, но останавливать работу всей страницы пока не будут получены нужные данные – недружественно (как минимум) по отношению к пользователю.

Используя Application.ProcessMessages в Delphi вроде бы как и ждёшь в одном месте программы, но в тоже время и работу приложения не останавливаешь. Очень хочется сделать тоже самое и в javascript.

Вопрос как? Есть идеи?

Андрей Параничев 23.08.2008 18:38

Надо сразу сказать, что JavaScript - строго однопоточный язык.

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

Вы хотите избавиться от асинхронности когда в Ajax приложениях? Даже если это чем-то оправдано, реализовать такое будет сложновато. Тем более, что при правильном дизайне Ajax приложения обработчики не будут создавать проблем.

В любом случае, я не понял, что вы конкретно хотите сделать. Напишите пример на псевдо-коде.

Autosof 23.08.2008 19:04

Ну например вот так:

function data_upload(name_first, name_last) {

    var ajax = new ajax_object()
    
    ajax.set('name_first', name_first)
    ajax.set('name_last', name_last)

    return ajax.upload()    
}

alert('Данные ' + (data_upload('Вася', 'Пупкин') ?
'сохранены' : 'не сохранены'))


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

Сейчас необходимо проделывать что-то вроде следующего:

function data_upload(name_first, name_last, callback) {

    var ajax = new ajax_object()
    
    ajax.set('name_first', name_first)
    ajax.set('name_last', name_last)

    ajax.upload(callback)    
}

function callback(ajax) {

    alert('Данные ' + (ajax.ok ? 'сохранены' : 'не сохранены')) 
}

data_upload('Вася', 'Пупкин', callback)


Кода намного больше, и он не всегда удобен... я бы даже сказал что неудобен всегда.

P.S. Не вызывает же необходимость обращения скажем к Math описывать callback функции для этого. Результат можно получить непосредственно в местах вызова. Вот и Ajax завернуть в "обертку" такой концепции было бы очень хорошо. Тоесть без использования функций callback.

Вообще говоря callback всё равно был бы. Но он был бы неявным. Единственная задача такой callback функции - опустить флаг занятости процеса ajax - тоесть просигнализировать что данные пришли и ожидание (использующее ProcessMessages) можна прекращать.

Kolyaj 23.08.2008 20:01

Autosof, ну делайте синхронные запросы к серверу, будет так, как вы хотите. Ну разве что браузер будет зависать, но это ведь мелочь по сравнению с описанием коллбэка.

З.Ы. Не надо стили работы с одним языком переносить на другой, это никогда ни к чему хорошему не приводило. Хотите изучать JavaScript -- изучайте, хотите дальше писать на Delphi -- пишите, а из их смеси ничего хорошего не получится (если вообще чего-нибудь получится).

Gvozd 23.08.2008 20:55

чесно, не доконца понимаю, что хотел бы сделать автор. возможно ему бы подошла такая форма записи:
function data_upload(name_first, name_last, callback) {
 
    var ajax = new ajax_object()
 
    ajax.set('name_first', name_first)
    ajax.set('name_last', name_last)
 
    ajax.upload(callback)    
}
data_upload('Вася', 'Пупкин', function(ajax){
    alert('Данные ' + (ajax.ok ? 'сохранены' : 'не сохранены')) 
//выполняется после прихода ответа с сервера
})
alert("а ответа еще нету")
//выполняется независимо от Ajaxa

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

Autosof 26.08.2008 13:30

Kolyaj:

Цитата:

Autosof, ну делайте синхронные запросы к серверу, будет так, как вы хотите.
Ну разве что браузер будет зависать, но это ведь мелочь по сравнению с
описанием коллбэка.
Ну вообщето я как раз и хотел узнать как избавиться от такого зависания...

Цитата:

Хотите изучать JavaScript -- изучайте,
хотите дальше писать на Delphi -- пишите, а из их смеси ничего хорошего не
получится (если вообще чего-нибудь получится).
Вот теперь я не понимаю. При чем тут изучение Javascript и из чего следует что меня интересует смешивание языков???

Gvozd:

Надо так:

function data_upload(name_first, name_last, callback) {
 
    var ajax = new ajax_object()
 
    ajax.set('name_first', name_first)
    ajax.set('name_last', name_last)
 
    ajax.upload(callback)    
}

data_upload('Вася', 'Пупкин', function(ajax){

   alert('Данные ' + (ajax.ok ? 'сохранены' : 'не сохранены')) 
   // выполняется после прихода ответа с сервера
   // в первую очередь
})


alert("а ответа еще нету")
// выполняется после прихода ответа с сервера
// во вторую очередь
// а не "выполняется независимо от Ajaxa"

Kolyaj 26.08.2008 13:37

Цитата:

Сообщение от Autosof
При чем тут изучение Javascript и из чего следует что меня интересует смешивание языков???

Принципы написания программ на разных языках разные. И изучение языка -- это, в первую очередь, изучение этих принципов (а не синтаксиса). Вы же пытаетесь принципы Delphi перенести в JavaScript. Желаемая вами схема просто невозможна в JavaScript (о чем и было сказано выше).

З.Ы. Вы лучше пишите с колбэками, потом Delphi будете вспоминать, как страшный сон.

Autosof 26.08.2008 14:28

Цитата:

Сообщение от Kolyaj (Сообщение 4991)
Желаемая вами схема просто невозможна в JavaScript (о чем и было сказано выше).

Ну если проблема в однопоточности языка, тогда, наверное, увы.
И очень, кстати говоря, жаль.

Цитата:

Сообщение от Kolyaj (Сообщение 4991)
З.Ы. Вы лучше пишите с колбэками, потом Delphi будете вспоминать, как страшный сон.

Delphi:
- получение результатов работы функций с местах обращения к ним - есть;
- использование событий (в том числе в виде callback) - есть;
- многопоточность - есть.

javascript:
- получение результатов работы функций с местах обращения к ним - есть;
- использование событий (в том числе в виде callback) - есть;
- многопоточность - нет (или всё таки есть?).

Javascript и Delphi - два одинаково страшных сна? :)

Андрей Параничев 26.08.2008 14:31

Autosof,
AJAX = Asynchronus JavaScript and XML. Асинхронность кода (callbacks) вы убрать полностью не сможете, не подвешивая браузер. В синхронном же варианте можно убрать подвисание одним способом - установкой колбеков.

И в JavaScript нет многопоточности. Лишь асинхронность в порядке выполнения колбеков и событий в общем потоке.

Kolyaj 26.08.2008 14:50

Цитата:

Сообщение от Autosof
Javascript и Delphi - два одинаково страшных сна?

Ну если по теме: в JavaScript функции -- объекты первого типа (их можно передавать, как параметры, в другие функции и возвращать, как результат работы функции), что в сочетании с замыканиями открывает такие возможности написания простого и лаконичного кода, который ObjectPascal'ю даже не снился.

З.Ы. За сим холивар заканчиваю.


Часовой пояс GMT +3, время: 13:14.