Javascript.RU

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

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

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

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

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

Вопрос как? Есть идеи?
Ответить с цитированием
  #2 (permalink)  
Старый 23.08.2008, 18:38
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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

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

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

В любом случае, я не понял, что вы конкретно хотите сделать. Напишите пример на псевдо-коде.
Ответить с цитированием
  #3 (permalink)  
Старый 23.08.2008, 19:04
Интересующийся
Отправить личное сообщение для Autosof Посмотреть профиль Найти все сообщения от Autosof
 
Регистрация: 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.
Ответить с цитированием
  #4 (permalink)  
Старый 23.08.2008, 20:01
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

З.Ы. Не надо стили работы с одним языком переносить на другой, это никогда ни к чему хорошему не приводило. Хотите изучать JavaScript -- изучайте, хотите дальше писать на Delphi -- пишите, а из их смеси ничего хорошего не получится (если вообще чего-нибудь получится).
Ответить с цитированием
  #5 (permalink)  
Старый 23.08.2008, 20:55
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 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-ф-цию
Ответить с цитированием
  #6 (permalink)  
Старый 26.08.2008, 13:30
Интересующийся
Отправить личное сообщение для Autosof Посмотреть профиль Найти все сообщения от Autosof
 
Регистрация: 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"
Ответить с цитированием
  #7 (permalink)  
Старый 26.08.2008, 13:37
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

З.Ы. Вы лучше пишите с колбэками, потом Delphi будете вспоминать, как страшный сон.
Ответить с цитированием
  #8 (permalink)  
Старый 26.08.2008, 14:28
Интересующийся
Отправить личное сообщение для Autosof Посмотреть профиль Найти все сообщения от Autosof
 
Регистрация: 23.08.2008
Сообщений: 20

Сообщение от Kolyaj Посмотреть сообщение
Желаемая вами схема просто невозможна в JavaScript (о чем и было сказано выше).
Ну если проблема в однопоточности языка, тогда, наверное, увы.
И очень, кстати говоря, жаль.

Сообщение от Kolyaj Посмотреть сообщение
З.Ы. Вы лучше пишите с колбэками, потом Delphi будете вспоминать, как страшный сон.
Delphi:
- получение результатов работы функций с местах обращения к ним - есть;
- использование событий (в том числе в виде callback) - есть;
- многопоточность - есть.

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

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

Последний раз редактировалось Autosof, 26.08.2008 в 14:35.
Ответить с цитированием
  #9 (permalink)  
Старый 26.08.2008, 14:31
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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

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

Последний раз редактировалось Андрей Параничев, 26.08.2008 в 14:33.
Ответить с цитированием
  #10 (permalink)  
Старый 26.08.2008, 14:50
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

З.Ы. За сим холивар заканчиваю.
Ответить с цитированием
Ответ



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

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