LINUX.ORG.RU

асинхронность в js - способы написания

 , ,


1

1

О великие писатели, использующие JS! Подскажите стиль, на котором вы пишите асинхронные запросы!
async/await или на promise (then, catch)?
Почему?

ИМХО:
да, async/await похож на другие языки, но надо самому try/catch АшЫбоК.
Promise - цепочки выполнения, тоже красиво.

P.S. для затравки, как оно было: https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

promise - это те же колбеки только сбоку (на самом деле async/await - это тоже колбеки, только под ковром) Труъ жс-еры не выбрасывают исключения, поэтому try/catch им не нужен в каждой дырке.

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

А я и не говорю что это плохо. ТС спрашивал как делаем вот я и вставил пять копеек, даже смайлик поставил чтоб дофига серьезно не воспринимали

pihter ★★★★★
()

Там где можно заюзать async/await юзай их. Читается как то по проще, хотя на любителя, требуется чутка привыкнуть перед тем как это станет проще.

Но не стоит забывать что у промисов есть прикольные фишки:

Promise.all(iterable)
Ожидает исполнения всех промисов или отклонения любого из них.

Promise.race(iterable)
Ожидает исполнения или отклонения любого из полученных промисов.

в общем и то и другое нужно)

TDrive ★★★★★
()

Только коллбэки, только хардкор!

А сам я только async/await через TS. Всё остальное - для тех, у кого много врмени на рефакторинг. ПОтому что JS - это нечитаемое г...о для маньяков.

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

Чем докажешь?

да сто пудов все остальное сделано поверх колбеков

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

https://developer.mozilla.org/ru/docs/orphaned/Web/JavaScript/Guide/Using_promises

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

То есть промис это объект с коллбэками. И он работает «чуть» медленнее чем просто коллбэк, так как интерпретатору ЖС необходимо сначала обратиться к объекту, а потом уже вызвать нужный коллбэк у этого объекта(не считая затраченное время на решение условия какой коллбэк нужно вызвать).

romanlinux ★★★
()
Последнее исправление: romanlinux (всего исправлений: 2)

стиль, на котором вы пишите асинхронные запросы

По ситуации. Вообще-то одно не исключает другого, я часто пишу типа

const result = await something().then(r => signalSomeEvent(r)).catch(e => console.error('Мы обосрались', e));
no-such-file ★★★★★
()
Ответ на: комментарий от romanlinux

Ага. Ну так давай ты скажешь поведение кода? А потом объяснишь, почему так. Ок?

...
setTimeout(()=>console.log('1'), 0)

fetch('http://amazingapireally/answer2').then(()=>console.log('2'))

console.log('3')

И он работает «чуть» медленнее чем просто коллбэк, так как интерпретатору ЖС необходимо сначала обратиться к объекту, а потом уже вызвать нужный коллбэк у этого объекта

А то я тут слегка прифигел.

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

Госпади чел. Как мы уже выяснили ты вроде как знаешь JS. И то что ты не понимаешь, очевидные вещи, что callback лучше в плане производительности, чем promise или async/await. Это уже твои проблемы… Мне дальше лень продолжать с тобой эту демагогию.

romanlinux ★★★
()
Последнее исправление: romanlinux (всего исправлений: 1)
Ответ на: комментарий от romanlinux

что callback лучше в плане производительности, чем promise или async/await

Покорми меня ещё. Не уходи! Я решил спросить, ответа нет. Ну-с, мы не унываем.

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

Щас во всех вменяемых языках try catch await async: python, javascript, swift

Поэтому тут даже вопрос не стоит - опускаться до callback hell или же писать как белые люди

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

Чем они фундаментально отличаются внутри?

В случае с V8 еще стоило бы спросить есть ли между ними разница для jit ) а то там приколов то хватает)

TDrive ★★★★★
()

да, async/await похож на другие языки, но надо самому try/catch АшЫбоК.

в промисах тоже надо самому

Promise.resolve().then(() => { throw new Error('1'); }).then(() => { lol }).catch((e) => console.log('error', e))

async/await начинает рулить когда есть циклы асинхронные.

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

Можно просто оставить тут вот это https://youtu.be/HPFARivHJRY

UPD: только там какой то обрезанный кусками доклад, но можно погуглить другие доклады от Вячеслава Егорова

Для фанатов бенчмарков на JS и всех кто просто хочет порофлить)

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)

async/await не увеличивает вложенность и сильно упрощает читаемость. Поэтому если есть возможность юзать - юзай.

Vit ★★★★★
()

При активном задействовании контекста, как при тестировании реактовских хуков в Jest, async/await без вариантов. В остальных случаях использую промисы без лишних проблем, ибо с декомпозицией в коде у меня всё ок.

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

У меня получается или 3 2 1 или 3 1 2. Тебя смущает что фетч отрабатывает быстрее таймаута? На сколько я помню в таймаутах есть некий минимум, то есть между setTimeout(f, 0) и setTimeout(f, 50) нету никакой разницы.

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

у меня не всегда) я несколько раз позапускал, зависит от инета

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

На самом деле у тебя нет гарантий, что setTimeout(0) (жалкое подобие nextTick) и fetch сидят на одной очереди микротасков. В примере просто кривой код, проведение которого изучать бессмысленно.

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

а они не сидят ;) Гарантии есть. Есть Ecma. Там есть две Queue. Гугель АбоЗвАл Microtask (promise) и Macrotask (callback).

Потом пацан из статьи по ссылке показал, что РЕАЛИЗАЦИЯ - говно. Надо быстро, бешенно исправлять, а значит разобраться в вопросе. Так и рулит, да-да.

shleemypants
() автор топика
Ответ на: комментарий от TDrive

Кривость в вопросе о последовательности, которая UB.

Ну то есть повыпендриваться на лоре можно, но практический смысл нулевой.

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