LINUX.ORG.RU

Асинхронные коллбэки vs коллбэки

 ,


0

1

А какое отношение асинхронные коллбеки имеют к коллбекам вообще?

Обычный, коллбек, как я себе это представляю, например:


hi=function(name, clb){return clb(name)}
console.log(hi("Joe", function(x){return ("Hi, "+x)}))

// Hi, Joe

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

Асинхронный коллбэк


fs.readFile("tmp", "ascii", function(err, data){console.log(data)})

// data from tmp

Что между ними общего? Только то, что в обеих случаях где то там на уровне реализации, и тот и другой коллбек является фреймом вызова. Но, вроде, как я понимаю, в первом случае, этот фрейм ложится на стек, а во втором — ставится в очередь. Вызывающая функция не принимает возврат из коллбэка, и, более того, не из нее он вызывается. Это семантический нонсенс. Почему это называют коллбэками? И зачем было реализовывать асинхронные вызовы через синтаксис коллбэков, если это к коллбэкам никакого отношения не имеет? Ведь, никакого «обратного» вызова тут нет, есть отсроченный вызов.



Последнее исправление: idiottoop (всего исправлений: 2)
Ответ на: комментарий от anonymous

Какие же ты тупорылые комментарии оставляешь, как назойливая муха, над ухом, BTW

idiottoop
() автор топика

Как-то так сложилось, причём задолго до жабаскрипта, передаваемая функция как аргумент это callback. Причём то, где она будет исполоваться: непосредственно в функции, чьим аргументом является или её зарегистрируют на какое-то событие и прикрутят к mainloop - это не важно. Да и разработчика это не должно тревожить, раз он передал функцию как аргумент, то она должна быть вызываемой и корректной в данном потоке.

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

Ну вот, как раз то, что я показал во втором примере. Я тоже считаю, что коллбеки тут не причем, есть асинхронные вызова, и их синтаксис должен бы был отличаться от коллбеков. Это вводит в заблуждение.

idiottoop
() автор топика

зачем было реализовывать асинхронные вызовы через синтаксис коллбэков, если это к коллбэкам никакого отношения не имеет?

это ты намекаешь на то что события нужно подключать через addEventListener ?

согласен.. addEventListener — было бы лучше :-)

user_id_68054 ★★★★★
()

anonimous, тебя снова забанили?

Aswed ★★★★★
()

Опять таблетки не принимаешь?

anonymous
()

Основная разница в том, захватывать переменные или нет. Есть реализации (борланд паскаль, ещё где-то видел), где можно объявлять внутри функции другую функцию, которая будет иметь доступ к переменным и параметрам внешней функции, но работать будет только пока эта функция активна. Если её указатель «убежит» (как во втором варианте), то будет неопределённое поведение. По сути там захватываемые переменные просто вызываются выше по стеку на этапе компиляции и всё. Это простой вариант.

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

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

Это когда Колобок в то время, когда его поедает Лиса, сматывается от Волка, Зайца, а потом печётся. А уже после того, как Лиса его съела, он ушёл от Дедушки и Бабушки, которые с горя принялись варить спагетмакароны.

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

Просто его тем среди потенциально похожих очень много, «движку ЛОРа» выбирать больше не из чего. Никакой магии.

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