Найдите и объясните баг в JavaScript-асинхронном коде: async function a(){ await b(); c(); } где b возвращает rejected Promise, а c должна выполняться только при успехе — как изменить код корректно
Баг в том, что при отклонённом промисе `await b()` бросит исключение, либо — если вы заранее «погасили» ошибку через `b().catch(...)` — вы непреднамеренно позволите `c()` выполниться. Правильный способ — явно обрабатывать успех/ошибку. Вариант с try/catch (выполнить `c()` только при успехе, при ошибке — обработать или пробросить): ``` async function a() { try { await b(); // если b отклонится — перейдём в catch и c() не выполнится c(); // выполняется только при успешном завершении b() } catch (err) { // обработка ошибки или throw err; // пробросить дальше, если нужно } } ``` Альтернатива через цепочку промисов: ``` function a() { return b().then(() => { c(); // выполнится только при resolve }); } ``` Важно: не писать `await b().catch(() => {})`, если вы хотите отменить выполнение `c()` при ошибке — такой catch «погасит» ошибку и `c()` выполнится.
Вариант с try/catch (выполнить `c()` только при успехе, при ошибке — обработать или пробросить):
```
async function a() {
try {
await b(); // если b отклонится — перейдём в catch и c() не выполнится
c(); // выполняется только при успешном завершении b()
} catch (err) {
// обработка ошибки или
throw err; // пробросить дальше, если нужно
}
}
```
Альтернатива через цепочку промисов:
```
function a() {
return b().then(() => {
c(); // выполнится только при resolve
});
}
```
Важно: не писать `await b().catch(() => {})`, если вы хотите отменить выполнение `c()` при ошибке — такой catch «погасит» ошибку и `c()` выполнится.