LINUX.ORG.RU

Асинхронность в стиле XMLHttpRequest

 , ,


0

1

Сейчас модно писать асинхронный код в виде какого то дерьма из так-называемых коллбэков (я имею в виду пробрасывание из функции в функцию, а-ля CPS). И все ноют, как мол, избавиться от этого говна, изобретают какие то уродливые велосипеды. А между тем, безо всяких велосипедов в JS есть нормальный способ писать асинхронный код, и был всегда, вспоминаем XMLHttpRequest. То есть, не то чтоб совсем без коллбэков, но нормально структуированный, в объектном стиле, как и подобает нормальному ООП-языку. Например:


File={
 open: function(fileName){
   var o=Object.create(this)
   o.file=fileName
   return o
 },
 read: function(){
   fs.readFile(this.file, "ascii", this.on())
 }, 
  onErr: function(err){console.log(err)}, // default on error
  onSuccess: function(data){console.log(data)}, // default on success
  on: function(){
   return function(err, data){if(err) this.onErr(err); this.onSuccess(data)}.bind(this)},
}

tmp=File.open("tmp.txt")
tmp.read()

tmp=File.open("tmp.txt")
tmp.onSuccess=function(data){console.log("bla-bla-bla\n"+data)}
tmp.read()

// ::: foo
// ::: bar
// ::: 
// ::: bla-bla-bla
// ::: foo
// ::: bar
ИМХО, это единственный нормальный вариант, в духе JS. Все остальное — для безмозглых фапе-хипстеров, которые любят обмазаться говном, а потом ищут способы отмыться.

Почему этот стиль не прижился?

on: function(){
return function(err, data){if(err) this.onErr(err); this.onSuccess(data)}.bind(this)},

вотето shit

Deleted ()

Сейчас модно писать асинхронный код в виде какого то дерьма из так-называемых коллбэков.

Написал код на коллбэках.

PolarFox ★★★★★ ()

Сейчас модно писать асинхронный код в виде какого то дерьма из так-называемых коллбэков

тебя надули, нормальные люди пишут на обещаниях

dib2 ★★★★★ ()

угадал автора с 3 слова.

anonymous ()

и где тут асинхронность? Ты обмазался говном, которое посыпано блестками и сахаром, но при этом ты все равно обмазался говном.

anonymous ()

Но у тебя все те же коллбеки.
А потом ты захотел обрабатывать файлы по расширению, ложить мету в базу и нода устраивает тебе gangbang.

ritsufag ★★★★★ ()
Ответ на: комментарий от theKingOfJava

то есть ты не знаешь, как это работает? тут такая же «асинхронность», как и при колбеках. Но ты продолжай надрачивать на блестки, барби.

anonymous ()
Ответ на: комментарий от ritsufag

все те же коллбеки.

Они нормально структуированы. Я имел в виду без ада. А совсем без них не обойтись, язык нам предоставляет доступ к асинхронности только через них.

А потом ты захотел обрабатывать файлы по расширению, ложить мету в базу и нода устраивает тебе gangbang.

че то я не понял, в чем проблема?

theKingOfJava ()
Ответ на: комментарий от anonymous

тут такая же «асинхронность», как и при колбеках

То есть при коллбэках асинхронности нет? Че ты вобще плетешь?

theKingOfJava ()

Потому что жаба-пистоно быдло, которое наспех переквалифицировалось в js-разработчики, не понимает, как работет позднее связывание. А смолтокеры все остались в прошлом веке.

anonymous ()
Ответ на: комментарий от anonymous

А что не так? Куча веба сейчас пишется на шарпе (ASP.NET MVC), игрушки (Unity), ну и десктоп понемногу.

NightmareZombie ()
Ответ на: комментарий от theKingOfJava

Ну мне с тобой всё равно не сравнится.

Kilte ★★★★★ ()

Оп-па, анонiмус :)

Deleted ()

норм асинхронщина сделана в OCaml'e, а то что я вижу в этом треде - говно говняное, да еще подается под видом не говна.

cyanide_regime ()
Ответ на: комментарий от cyanide_regime

а монады не могут быть асинхронными что ли?

допустим, асинхронным может быть все что угодно, хоть яйца. Как они помогают бороться с callback hell? приведи пример.

anonymous ()
Ответ на: комментарий от anonymous

f1 >>= f2

шедулим f1, когда результат ее выполнения будет доступен, передаем его в f2 и шедулим ее. async в ocaml'e полностью на таком подходе построен.

cyanide_regime ()
Ответ на: комментарий от anonymous
open Async.Std
open Core.Std

let echo sock : unit Deferred.t =
  let fd = Socket.fd sock in
  let r, w = (Reader.create fd, Writer.create fd) in
  let rec start_echo () =
  Reader.read_line r 
  >>= (function|`Eof -> 
	            Reader.close r
                    >>= fun _ -> Writer.close w
                    >>= fun _ -> return ()
               |`Ok line ->
                    Writer.write_line w line;
                    Writer.flushed w
                    >>= fun _ -> start_echo ()) in start_echo ()

let rec acceptor sock =
    Socket.accept sock 
    >>= (function  |`Socket_closed -> return ()
	           |`Ok (clientsock, _) -> 
                       ignore(echo clientsock);                       
		       acceptor sock)

let () = 
  try Unix.unlink "/tmp/async.usock"  with _ -> ();
  Socket.bind (Socket.create Socket.Type.unix) ?reuseaddr:(Some true) (Socket.Address.Unix.create "/tmp/async.usock")
  >>| (fun s -> Socket.listen s)
  >>= acceptor >>> fun () -> ()

let () = 
  never_returns (Scheduler.go ())

наколеночно, но надеюсь понятно - эхо-сервер на UD-сокетах..

cyanide_regime ()
Ответ на: комментарий от anonymous

А как результат f1 передать сразу в f2 и f3?

f1 >>= (fun x -> ignore(f2 x); f3 x)

в вышеприведенном примере в функции acceptor так и происходит.

cyanide_regime ()
Ответ на: комментарий от anonymous

быдло, которое наспех переквалифицировалось в js-разработчики ... А смолтокеры все остались в прошлом веке.

Этого достаточно, чтобы объяснить ад в js софте.
Когда пытался разобраться в некоторых, так сказать, кунштюках для некоторых вещей на js по stackoverflow, у меня сложилось стойкое впечатление, что две трети советчиков вообще не представляют, что они советуют, но таки работает, а «научный тык» - стандартный способ отладки js. После этого решил прекратить порочную практику копипасты «рецептов» для js. ЧСХ, для php, перла-питона и Цэ это работает.

Shadow ★★★★★ ()
Ответ на: комментарий от anonymous

Причем тут монады? Какое они отношение имеют к асинхронности?

Почитай про реализацию асинхронности в C#/F#/Haskell, например.

ovk48 ★★★ ()
Ответ на: комментарий от ovk48

C#/F#/Haskell,

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

anonymous ()
Ответ на: комментарий от anonymous

В функциональщине не может быть асинхронщины.

Не понял, ты хочешь сказать, что монады невозможно реализовать за пределами чистых ФЯ?

ovk48 ★★★ ()
Ответ на: комментарий от anonymous

Монады можно реализовать хоть где, но они нигде не нужны кроме ФП.

Как выясняется, нужны. Например, для удобного управления асинхронностью. Или для удобной обработки ошибок. Или для написания парсеров. И т.д.

ovk48 ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.