Comments 17
function test () { setTimeout(function () { throw new Error('MyError'); }, 100); } try { test(); } catch (err) { console.error('Request boom! ', err); }
На самом деле, это лишь вершина айсберга того, что называется промисами. Вот материал, который я рекомендую почитать тем, кто хочет более основательно погрузиться в эту тему.
Вот оно же на русском: habrahabr.ru/company/mailru/blog/269465/
Если объединить в цепочку несколько вызовов .then, в конце соответствующих коллбэков следует всегда использовать return, иначе все они будут выполнены одновременно, а это, очевидно, не то, чего вы хотите достичь;
О чем это вообще?
При выполнении команды reject, если следующим в цепочке идёт .then, он будет выполнен (вы можете считать .then выражением, которое выполняется в любом случае);
Вранье. Ну или просто кривой перевод:
new Promise((resolve, reject) => reject("error")).then(() => console.log("Этого сообщения в консоли вы не увидите!"))
Также новичка может ввести в заблуждение тот факт, что в примере с промисами вы обрабатывали ответы от сервера по всем пользователям вместе — а в примере с async/await вы почему-то решили обрабатывать их отдельно.
На самом деле эквивалентный тому что было написано ранее код должен был выглядеть так:
async function list() {
const userGet = `https://api.github.com/search/users?page=1&q=daspinola&type=Users`
const users = await request(userGet)
const usersList = JSON.parse(users).items
const repos = await usersList.map(user => request(user.repos_url));
handleRepoList(repos);
}
Ну а в разделе про генераторы написана просто непонятная фигня...
UPD Promise.all забыл, и никто ничего не заметил...
async function list() {
const userGet = `https://api.github.com/search/users?page=1&q=daspinola&type=Users`
const users = await request(userGet)
const usersList = JSON.parse(users).items
const repos = await Promise.all(usersList.map(user => request(user.repos_url)));
handleRepoList(repos);
}
А если так?
new Promise((resolve, reject) => reject("error")).then(() => console.log("Этого сообщения в консоли вы не увидите!"), () => console.log("А это увидите!"))
Ну да, второй аргумент then — это то же самое что и catch.
Только все равно не выходит "выполнится в любом случае".
somePromise.then(onResolve, onReject)
в этом случае, если ошибка возникнет в методе onResolve, то она не попадет в onReject
а в этом случае
somePromise.then(onResolve).catch(onReject)
ошибка, которая может возникнуть в onResolve попадет в onReject
И немаловажный плюс — читабельность.
Иногда такое поведение и ожидается.
Пример — https://github.com/caolan/async/pull/1197
Еще уточнение.
Минус async/await, как и минус генераторов, заключается в том, что эту конструкцию не поддерживают старые браузеры, а для её использования в серверной разработке нужно пользоваться Node 8.
Нода шестой версии без проблем воспринимает async/await и генераторы если запускать ее с ключом --harmony
JavaScript: методы асинхронного программирования