ProcessMessages
Вопрос к более знающим и понимающим.
Как в javascript реализовать что-то наподобие Application.ProcessMessages в Dephi. На мой взгляд, использование такого механизма очень удобно. Например, используя Ajax нужно отлавливать события завершения процесса передачи данных, а значит нужно объявлять дополнительные функции-обработчики. Если таких запросов много то и функций-обработчиков, как правило, тоже много. А чем больше программного кода, тем сложнее в него впоследствии вносить изменения и вообще сопровождать. Это правило, к сожалению, никто не отменял. Конечно, можно выполнять запросы асинхронно, но останавливать работу всей страницы пока не будут получены нужные данные – недружественно (как минимум) по отношению к пользователю. Используя Application.ProcessMessages в Delphi вроде бы как и ждёшь в одном месте программы, но в тоже время и работу приложения не останавливаешь. Очень хочется сделать тоже самое и в javascript. Вопрос как? Есть идеи? |
Надо сразу сказать, что JavaScript - строго однопоточный язык.
Использование ProcessMessages в длинных циклах можно реализовать через отложенное выполнение итераций (через setTimeout), но только для того, чтоб можно было совершать действия практически параллельно с итерациями цикла, т.е. чистая эмуляция. Я не очень понимаю, как это поможет в случае Ajax. Вы хотите избавиться от асинхронности когда в Ajax приложениях? Даже если это чем-то оправдано, реализовать такое будет сложновато. Тем более, что при правильном дизайне Ajax приложения обработчики не будут создавать проблем. В любом случае, я не понял, что вы конкретно хотите сделать. Напишите пример на псевдо-коде. |
Ну например вот так:
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, ну делайте синхронные запросы к серверу, будет так, как вы хотите. Ну разве что браузер будет зависать, но это ведь мелочь по сравнению с описанием коллбэка.
З.Ы. Не надо стили работы с одним языком переносить на другой, это никогда ни к чему хорошему не приводило. Хотите изучать JavaScript -- изучайте, хотите дальше писать на Delphi -- пишите, а из их смеси ничего хорошего не получится (если вообще чего-нибудь получится). |
чесно, не доконца понимаю, что хотел бы сделать автор. возможно ему бы подошла такая форма записи:
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-ф-цию |
Kolyaj:
Цитата:
Цитата:
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" |
Цитата:
З.Ы. Вы лучше пишите с колбэками, потом Delphi будете вспоминать, как страшный сон. |
Цитата:
И очень, кстати говоря, жаль. Цитата:
- получение результатов работы функций с местах обращения к ним - есть; - использование событий (в том числе в виде callback) - есть; - многопоточность - есть. javascript: - получение результатов работы функций с местах обращения к ним - есть; - использование событий (в том числе в виде callback) - есть; - многопоточность - нет (или всё таки есть?). Javascript и Delphi - два одинаково страшных сна? :) |
Autosof,
AJAX = Asynchronus JavaScript and XML. Асинхронность кода (callbacks) вы убрать полностью не сможете, не подвешивая браузер. В синхронном же варианте можно убрать подвисание одним способом - установкой колбеков. И в JavaScript нет многопоточности. Лишь асинхронность в порядке выполнения колбеков и событий в общем потоке. |
Цитата:
З.Ы. За сим холивар заканчиваю. |
Часовой пояс GMT +3, время: 13:14. |