Асинхронный JavaScript

Роман Лютиков, Redradix

Callbacks

Пример
db.save(user, function(error, result) {
  if (error) {
    return console.error(error.stack);
  }
  res.send(result, function(err) {
    if (err) {
      console.error(err.stack);
    }
  });
});

Проблемы

Promises

Пример
db.save(user)
  .then(function(result) {
    return res.send(result);
  })
  .catch(function(err) {
    console.error(err.stack);
  });

Callbacks → Promises

function saveUser(user) {
  return new Promise(function(resolve, reject) {
    db.save(user, function(error, result) {
      if (error) { return reject(error); }
      resolve(result);
    });
  });
}

Лучше? Не думаю.

ES2015 Generators

Пример
co(function*() {
  try {
    var result = yield db.save(user);
    res.send(result);
  } catch (err) {
    console.error(err.stack);
  }
});

Пойдет, но как-то странно

ES2017 async/await

Пример
async function handleUser(user) {
  try {
    var result = await db.save(user);
    res.send(result);
  } catch (err) {
    console.error(err.stack);
  }
});

Убедил?

Как попробовать async/await?