Pull to refresh

Comments 17

В первом фрагменте кода беда с разметкой
Спасибо, исправлено.
Заворачивание асинхронного кода в try...catch особого смысла не имеет, поскольку ошибка не будет поймана.
Код
function test () {
    setTimeout(function () {
         throw new Error('MyError');
    }, 100);
}

try {
    test();
} catch (err) {
    console.error('Request boom! ', err);
}

Не понял, для чего там холостое прерывание yield?
Занятно, что в примере с callback hell используется библиотека async.js, но при этом не применяется async.waterfall, который как раз и предназначен для придания читабельности вложенным вызовам. А для разрешения «состояния гонки» есть .eachSeries. У меня на сегодня двоякое отношение к async.js, но в проектах, использующих промизы, я иногда вспоминаю его добрым словом.
На самом деле, это лишь вершина айсберга того, что называется промисами. Вот материал, который я рекомендую почитать тем, кто хочет более основательно погрузиться в эту тему.


Вот оно же на русском: habrahabr.ru/company/mailru/blog/269465/
UFO landed and left these words here
А генераторы вроде для других задач совсем.
да, генераторы в этой статье совсем не в тему
Если объединить в цепочку несколько вызовов .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.


Только все равно не выходит "выполнится в любом случае".

К. т. обработка ошибок во втором аргументе then практика не очень.

    somePromise.then(onResolve, onReject)

в этом случае, если ошибка возникнет в методе onResolve, то она не попадет в onReject
а в этом случае
    somePromise.then(onResolve).catch(onReject)

ошибка, которая может возникнуть в onResolve попадет в onReject

И немаловажный плюс — читабельность.

Еще уточнение.


Минус async/await, как и минус генераторов, заключается в том, что эту конструкцию не поддерживают старые браузеры, а для её использования в серверной разработке нужно пользоваться Node 8.

Нода шестой версии без проблем воспринимает async/await и генераторы если запускать ее с ключом --harmony

Очень нравиться роботать с асинхронностю используя библиотеку Fluture. Она ленива (в отльчии от промисов), хорошо комбинируеться с Ramda и если надо ёё удобно использовать с генераторами (как do-notation в haskell).
Only those users with full accounts are able to leave comments. Log in, please.