войти зарегистрироваться

JavaScriptПоследовательный вызов асинхронных функций

Как известно, язык JavaScript преследует парадигму событийно-ориентированного программирования. Это, безусловно, хорошо, но что делать, если за одной асинхронной функцией должна вызываться другая асинхронная функция, а затем еще одна, и еще… Иногда такой код очень запутывает, и не только человека привыкшего к синхронному и поочередному вызову функций. Это касается сложных анимаций, таймаутов, аякса, когда за одним должно следовать другое, и так дальше.

Поэтому, я разработал свой костыль, который позволяет более наглядно вызывать асинхронные функции, запускающие callback после выполнения. Вполне вероятно, что решение уже давно существует, но я, к сожалению, такого решения не нашел.

UPD
image
Ниже моё решение, являющееся аналогом этой функции модуля async и кучи других подобных решений, представленных в комментариях. Спасибо всем комментирующим и sedictor в частности.
/UPD

Рассмотрим пример (который взят из головы и в нем возможны ошибки) гипотетического парсера сайта, который после парсинга заносит данные в БД, и, после занесения, вызывает некоторый код.

var html = '';
request.on('response', function (response) {

    response.on('data', function (chunk) {
        html = html + chunk;
    });

    response.on('end', function() {
        //какой-то парсер
        parse(html, function(data){  
                //какая-нибудь функция, добавляющая данные в базу
		addToDatabase(data, function() {  
			doSomething();
		})
	});

    });
});


Много вложенных колбеков — не есть гуд, пробуем по-другому.

IP-телефонияЗвоним дешево мобильно, использование VoIP на сотовом

На дворе уже давно 21 век, а проблема «как удобно и дешево позвонить» все еще актуальна. Даже современный смартфон с SIP клиентом не всегда спасает, ведь WiFi есть не везде, да и работает не всегда хорошо, и 3G тоже в наших реалиях не слишком радует покрытием. Как тогда позвонить, не думая о том, чтобы бегать в поисках хорошего уровня сигнала?
Предложение звонить через компьютер не рассматриваем, есть ведь понятие удобство. Говорить через компьютер не намного удобней, чем набирать статью на сотовом, или смотреть фильм на gps навигаторе. Также не рассматриваем установку дома ip-телефона, мало кто сейчас может себе позволить ехать домой для важного звонка.
image
Итак, вот что у нас остается для дешевых звонков в другой регион/страну с мобильного:
  1. SIP через WiFi, 3G – дешево, но не всегда мобильно, нужен хороший смартфон
  2. CallBack (обратный звонок) – уже не так дешево, не очень удобно, но доступно везде
  3. Звонок через бесплатный шлюз– дешево, просто, мобильно, но доступно не везде

Разберем все способы.

Веб-разработкаInline-callback в tornado server для asyncmongo

Пару недель назад разработчики tornado добавили нативный модуль по созданию inline callback (аналог inlineCallbacks в Twisted, Seq в Node.js, Fibers в Ruby).
Ниже примеры использования и примеры с участием asyncmongo (асинхронным драйвером для mongoDB)

Блог компании E1tele.comIp-телефония для блондинок

Одно из моих самых любимых достижений современной науки и техники – это ip-телефония. И
если раньше я имела об этом весьма смутное представление, то когда моя мама переехала в Америку (2 года назад), пришлось задуматься. Потому что денег на мобильную связь уходило безумное количество, но ощущение того, что я ещё не всё сказала, оставалось перманентным. Люблю, знаете ли, поболтать.
Всем известно, что IP-телефония – это дешево и качественно. Правда, слегка сложновато. Я
далеко не сразу разобралась с таким нестандартным способом совершения звонка. Но если подойти к этому делу основательно, никаких проблем не возникнет. Именно поэтому я решила посвятить данному вопросу свою статью. Надеюсь, что полезно будет не только блондинкам=).
В качестве материала для разбирательств, естественно, воспользуюсь сайтом нашей компании
e1tele.com/. Мы предлагаем юзерам одну из следующих технологий: callback или callin.
Несмотря на очевидность названий, есть нюансы, которые будут рассмотрены ниже. Иллюстрации по тексту в помощь девушкам=).

Блог компании E1tele.comИнтеграция сервиса E1tele.com с Microsoft Outlook

В нашу фирму обратился клиент с вопросом: а можно ли совершать звонки из контактов outlook? Пока наши специалисты помогали ему разобраться с этой задачей, я решила, что напишу об этом подробную статью. Всё-таки, наш сервис можно использовать во всём его многообразии, особенно, если разобраться, как это просто.
Если вы имеете привычку заносить все телефонные номера партнеров и коллег в контакты Microsoft Outlook, то это может обернутся вам функциональным сервисом связи, который облегчает ежедневное общение.

jQueryИспользование Deferred объектов в jQuery 1.5

Deferred объекты появились в jQuery 1.5. Они позволяют отделить логику, которая зависит от результатов выполнения действия от самого действия. Для JavaScript Deferred объекты не новы, они уже были в MochiKit и Dojo, но с изменениями логики jQuery ajax от Julian Aubourg, внедрение Deferred объектов было неминуемо. С Deferred объектами несколько callback могут быть связаны с результатом задачи и любые из них могут быть привязаны к действию даже после начала его выполнения. Выполняемая задача может быть асинхронна, но не обязательно.

Deferred объекты теперь встроены в $.ajax() таким образом вы будете получать их автоматически. Обработчики теперь могут быть связаны с результатом следующим образом:
// $.get, ajax запрос, он асинхронный по умолчанию
var req = $.get('foo.htm')
   .success(function( response ){
      // что-нибудь делаем с ответом
   })
   .error(function(){
      // делаем что-нибудь если запрос провалился
   });
 
// это выполнится перед тем как $.get() будет выполнено
doSomethingAwesome();
 
// Делаем что-то ещё перед завершением запроса
req.success(function( response ){
   // делаем  что-то ещё с ответом
   // он будет выполнен когда запрос завершится, а если запрос завершен, то будет вызван немедленно
   // если запрос уже был выполнен
});

C++Обратные вызовы и исключения С++

Введение


Как известно, многие С-библиотеки используют обратные вызовы для обеспечения какого-либо функционала. Так поступает, например, библиотека expat для реализации SAX модели. Обратный вызов или callback используется для возможности выполнить пользовательский код на стороне библиотеки. Пока такой код не несет побочных эффектов — все нормально, но как только на арене появляется С++, все, как всегда, становится нетривиальным.

JavaScriptУдобный callback

Надоело каждый раз писать колбеки руками. Написал простенькую скриптину, которая запонимает функцию (функции) с массивом аргументов и контекстом в объекте с методом fire, который не зависит от this, чтобы можно было цеплять колбек не только в «чистом» коде, но и к онклику или таймеру. Набор исполняемых функций и аргументов/контекста к каждой из них произвольный.

Краудсорсинг Уменьшение расходов на связь

Задумался я недавно как можно сократить расходы на связь — мобильную и стационарную. В результате чего родился сей опус, который пишу с целью добавления вами, мои читатели еще более лучших и удобных вариантов. Итак далее рассмотренные 7 вариантов…

Персональные блоги Почтовый сервис с принципом обратной связи

Все (а если не все, то многие) современные почтовые сервисы основаны на связке очень старых, но проверенных временем протоколах POP3, SMTP или, реже, IMAP4. POP3 протокол позволяет принимать почту, SMTP - отправлять. IMAP4 же отличается от POP3 только развитыми средствами хранения и поиска почты на сервере (я специально утрирую, не обращайте внимания).

Мы создаём письмо, нажимаем "Отправить". Происходит соединение с SMTP-сервером, письмо отправляется. Мы нажимаем "Получить", почтовая программа соединяется с POP3-сервером, проверяет наличие писем и, если они есть, сливает их на компьютер. Всё просто.

Но что же делать, если я хочу получить письмо, не тридцать три раза проверив почтовый ящик, а один, гарантированный? Современные популярные почтовые сервисы позволяют подключить услугу "уведомление на почтовый ящик". Спрашивается, а смысл? Мне придётся проверить один ящик, чтобы узнать о получении письма на другой? Бред. Есть также услуга "уведомление на мобильный телефон". Но этот вариант не устраивает лично меня, потому что требует денег. Да и оперативным назвать приём почты посредством этой услуги я бы поостерёгся.

И здесь возникает идея (не ко мне первому она пришла, уверен!) почтового сервиса с принципом обратной связи. Один из вариантов реализации этой обратной связи я опишу далее. В программу-клиент совместно со стандартными функциями по приёму сообщений включается маленький smtp-сервер (маленькие буковки маленькому сервису), который умеет только принять уведомление о поступлении нового письма. В теле уведомления уже можно передать любую информацию, например имя отправителя, время поступления корреспонденции или само письмо. Таким образом, можно хорошо сэкономить на трафике (мы не проверяем судорожно бесчисленное количество раз почту, а лишь ждём уведомления), несколько увеличив нагрузку на сервер лишней операцией (хотя, мы его сразу же и разгрузим уменьшением количества обращений).

Повторяю, это лишь один из способов организации взаимодействия сервера и клиента. Также можно рассмотреть уведомления на IM, но ценность как раз в автоматизации процесса и прозрачности его для пользователя.

Что думаете по этому поводу?