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/

Ответ на: комментарий от byko3y

Слушай, а у меня погорело. Я в упор не мог понять, откуда тут UnhandledPromiseRejection.

вся проблема в том, что async/await код кажется линейным, не являсь им по факту.

А в случае заранее заготовленных промисов таки сахар просыпается и приходится его собирать руками

сахарок забавный, чем дальше в лес, тем больше приколов:

const gen = function *() {
    try {
        yield Promise.resolve('only one more to go');
        yield Promise.reject('congratulations you are dead');
        yield Promise.resolve('done');
    } finally {
        console.log('sequence complete');
    }
};

(async () => {
    for await (const msg of gen()) {
        console.log(msg);
    }
})().catch((e) => {
    console.log('i will try to fix it lol,', e);
});

(async () => {
    console.log('better one')
    for (const msg of gen()) {
        try {
            console.log(await msg);
        } catch (e) {
            console.log('hell yeah,', e);
        }
    }
})();

^ для любителей задач на порядок сообщений

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

проблема в том, что async/await код кажется линейным, не являсь им по факту

Тогда, наверное, лучше все-таки использовать цепочки .then(). Так проще понять, что за чем идет.

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

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

вся проблема в том, что async/await код кажется линейным, не являсь им по факту.

КМК проблема в неявном смешивании стилей программирования. IMO это как-то разруливается через coding style. По принципу «не делай return из catch». Некоторые гайки можно прямо линтером закрутить.

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

Можно просто Promise.catch(console.error):

new Promise((res, rej) => rej(new Error('Ви таки обосрались!'))).catch(console.error)
tz4678 ★★
()
Ответ на: комментарий от static_lab

у меня додики спрашивали а что будет, если в питоне засунуть список в качестве ключа словаря… да не имеют такие вопросы смысла: они сродни тому, что спрсить пробовали вы протыкать свои яйца иглой. зочем???????????????? ты даже это когда-либо пыталсся сделать, то уже и не вспомнишь, что из этого вышло. я помнил только, что в исходниках либы для работы с сокетами видел что-то типа:

connections = {}

s = socket.connect(hostname, port)
connection[(hostname, port)] = s

Я предположил, что можно, а оно unhashable… Высранный же вопрос для ноды тоже какой-то из раздела абнормального программирования и с практической точки бессмысленен.

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

да, это задача чисто продемонстрировать нюансы.

можешь еще попробовать [2] первый цикл с

-const gen = function *() {
+const gen = async function *() {

почему в первом примере порядок сообщений именно такой?

почему в случае [2] сработает finally?

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

КМК проблема в неявном смешивании стилей программирования. IMO это как-то разруливается через coding style.

Да, я к тому, что переход от тупых коллбеков к промисам упрощает обработку ошибок.

А вот с async\await проще не становится, становится удобнее, да так что без него уже боль писать.

Опять же pure async\await код без .then, new Promise и тд, на практике не возможен, вопрос TCа не корректен.

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

вообще калбеки в олдстайловом js были нормальные и читаемые. Типа как в браузерном request.

Это начиная примерно со времен ноды они все испоганили этими внутренними выражениями. Там было помню все абсолютно просто.

типа

[code] onevent = callback onEnotherEvent = callback2 [/code]

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

асинхронщина это по сути своей всегда реакция на события. Это эвент-парадигма.

Хз почему они не могут сделать это по человечески, семантически прозрачно. Может тупо вредительство, чтобы пудрить мозги быдлу Такой тренд вообще имеет место

libgtk318
()

ты создал событие, повесил на него инструкцию в виде коллбека, к этому все сводится. Это просто по сути своей. У них же выходит адская лапша и костыли

libgtk318
()

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

[code=js] onSomeEvent = function(){blabla; createEvent(someEventDone)} onSomeEventDone = enotherCallback [/code]

это решение блеать само напрашивается но вот х вам, драчите нашу лапшу

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