23.08.2008, 18:12
|
Интересующийся
|
|
Регистрация: 23.08.2008
Сообщений: 20
|
|
ProcessMessages
Вопрос к более знающим и понимающим.
Как в javascript реализовать что-то наподобие Application.ProcessMessages в Dephi. На мой взгляд, использование такого механизма очень удобно.
Например, используя Ajax нужно отлавливать события завершения процесса передачи данных, а значит нужно объявлять дополнительные функции-обработчики. Если таких запросов много то и функций-обработчиков, как правило, тоже много. А чем больше программного кода, тем сложнее в него впоследствии вносить изменения и вообще сопровождать. Это правило, к сожалению, никто не отменял. Конечно, можно выполнять запросы асинхронно, но останавливать работу всей страницы пока не будут получены нужные данные – недружественно (как минимум) по отношению к пользователю.
Используя Application.ProcessMessages в Delphi вроде бы как и ждёшь в одном месте программы, но в тоже время и работу приложения не останавливаешь. Очень хочется сделать тоже самое и в javascript.
Вопрос как? Есть идеи?
|
|
23.08.2008, 18:38
|
|
|
Регистрация: 21.02.2008
Сообщений: 1,250
|
|
Надо сразу сказать, что JavaScript - строго однопоточный язык.
Использование ProcessMessages в длинных циклах можно реализовать через отложенное выполнение итераций (через setTimeout), но только для того, чтоб можно было совершать действия практически параллельно с итерациями цикла, т.е. чистая эмуляция. Я не очень понимаю, как это поможет в случае Ajax.
Вы хотите избавиться от асинхронности когда в Ajax приложениях? Даже если это чем-то оправдано, реализовать такое будет сложновато. Тем более, что при правильном дизайне Ajax приложения обработчики не будут создавать проблем.
В любом случае, я не понял, что вы конкретно хотите сделать. Напишите пример на псевдо-коде.
|
|
23.08.2008, 19:04
|
Интересующийся
|
|
Регистрация: 23.08.2008
Сообщений: 20
|
|
Ну например вот так:
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) можна прекращать.
Последний раз редактировалось Autosof, 23.08.2008 в 19:09.
|
|
23.08.2008, 20:01
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Autosof, ну делайте синхронные запросы к серверу, будет так, как вы хотите. Ну разве что браузер будет зависать, но это ведь мелочь по сравнению с описанием коллбэка.
З.Ы. Не надо стили работы с одним языком переносить на другой, это никогда ни к чему хорошему не приводило. Хотите изучать JavaScript -- изучайте, хотите дальше писать на Delphi -- пишите, а из их смеси ничего хорошего не получится (если вообще чего-нибудь получится).
|
|
23.08.2008, 20:55
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
чесно, не доконца понимаю, что хотел бы сделать автор. возможно ему бы подошла такая форма записи:
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-ф-цию
|
|
26.08.2008, 13:30
|
Интересующийся
|
|
Регистрация: 23.08.2008
Сообщений: 20
|
|
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"
|
|
26.08.2008, 13:37
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Autosof
|
При чем тут изучение Javascript и из чего следует что меня интересует смешивание языков???
|
Принципы написания программ на разных языках разные. И изучение языка -- это, в первую очередь, изучение этих принципов (а не синтаксиса). Вы же пытаетесь принципы Delphi перенести в JavaScript. Желаемая вами схема просто невозможна в JavaScript (о чем и было сказано выше).
З.Ы. Вы лучше пишите с колбэками, потом Delphi будете вспоминать, как страшный сон.
|
|
26.08.2008, 14:28
|
Интересующийся
|
|
Регистрация: 23.08.2008
Сообщений: 20
|
|
Сообщение от Kolyaj
|
Желаемая вами схема просто невозможна в JavaScript (о чем и было сказано выше).
|
Ну если проблема в однопоточности языка, тогда, наверное, увы.
И очень, кстати говоря, жаль.
Сообщение от Kolyaj
|
З.Ы. Вы лучше пишите с колбэками, потом Delphi будете вспоминать, как страшный сон.
|
Delphi:
- получение результатов работы функций с местах обращения к ним - есть;
- использование событий (в том числе в виде callback) - есть;
- многопоточность - есть.
javascript :
- получение результатов работы функций с местах обращения к ним - есть;
- использование событий (в том числе в виде callback) - есть;
- многопоточность - нет (или всё таки есть?).
Javascript и Delphi - два одинаково страшных сна?
Последний раз редактировалось Autosof, 26.08.2008 в 14:35.
|
|
26.08.2008, 14:31
|
|
|
Регистрация: 21.02.2008
Сообщений: 1,250
|
|
Autosof,
AJAX = Asynchronus JavaScript and XML. Асинхронность кода (callbacks) вы убрать полностью не сможете, не подвешивая браузер. В синхронном же варианте можно убрать подвисание одним способом - установкой колбеков.
И в JavaScript нет многопоточности. Лишь асинхронность в порядке выполнения колбеков и событий в общем потоке.
Последний раз редактировалось Андрей Параничев, 26.08.2008 в 14:33.
|
|
26.08.2008, 14:50
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Autosof
|
Javascript и Delphi - два одинаково страшных сна?
|
Ну если по теме: в JavaScript функции -- объекты первого типа (их можно передавать, как параметры, в другие функции и возвращать, как результат работы функции), что в сочетании с замыканиями открывает такие возможности написания простого и лаконичного кода, который ObjectPascal'ю даже не снился.
З.Ы. За сим холивар заканчиваю.
|
|
|
|