Будущее асинхронного программирования и ECMAScript

Алексей Распопов, DataRobot.

Будущее асинхронного программирования

Алексей Распопов

whoami

Побочные эффекты (side effects)

Общение с другими сервисами/базами данных, события в окружении, прочее.

Асинхронное программирование

Тип параллельных вычислений, который подразумевает, что операция может быть выполнена кем-то на стороне, за пределами текущего вычислительного устройства.

Можно выполнять несколько асинхронных операций одновременно.

Результат работы нужно ждать.

Где в JavaScript асинхронное программирование?

Как мы это делаем?

Promise?

Обещания это хорошо?

Все еще коллбеки!

			get('/resources', (resources) => {
			  renderResources(resources);
			});
		
			get('/resources').then((resources) => {
			  renderResources(resources);
			});
		

Новый (другой) синтаксис

			function main() {
			  try {
			    let resources = getResources();
			    render(resources);
			  } catch (error) {
			    // wow
			  }
			}
		
			function main() {
			  getResources()
			    .then((resources) => {
			      render(resources);
			    })
			    .catch((error) => {
			      // wow
			    })
			}
		
			function main() {
			  getResources()
			    .then((resources) => {
			      render(resources);
			    })
			    .catch((error) => {
			      // wow
			    })
			    .finally(() => {
			      // hell yeah
			    })
			}
		

Angular, что ты делаешь, ахаха, прекрати!

Антипаттерны и сложности

Хорошие практики

ECMAScript 20XX

Статус спецификаций

async/await

Асинхронные функции

			function main() {
			  try {
			    let resources = getResources();
			    render(resources);
			  } catch (error) {
			    // wow
			  }
			}
		
			async function main() {
			  try {
			    let resources = await getResources();
			    render(resources);
			  } catch (error) {
			    // wow
			  }
			}
		
			async function a() {
			  let status;
			  do {
			    status = await get('/status');
			    // ...
			  } while (status !== 'COMPLETED');
			  return result;
			}
		

Как? Хочу прямо сейчас!

Генераторы и итераторы

			function* numbers() {
			  yield 1;
			  yield 2;
			  return 3;
			}
		
			const iterator = numbers();
			iterator.next(); // 1
			iterator.next(); // 2
			iterator.next(); // 3
		

Корутины

			co(function*() {
			  var str = yield read(‘secret-passwords.txt’);
			  str = str.replace(‘qwerty’, ‘123456’);
			  yield write(‘new-passwords.txt’, str);
			});
		

npm install co

browserify code.js > bundle.js

Async/await уже сегодня

			const getResources = co.wrap(function* (name) {
			  try {
			    const data = yield fetch(`/resources/${name}`);
			    // ...
			    return result;
			  } catch (error) {
			    // wow
			  }
			});
		

Async/await и коллекции

Еще больше интерфейсов

			[1, 2, 3, 4]
			  .map(n => n * 3)
			  .filter(n => n < 10)
		

Что не так?

Можно использовать итератор

			function* getNames(users) {
			  for (let user of users)
			    yield user.name;
			}
		
			function* isAdult(users) {
			  for (let user of users)
			    if (user.age > 18) yield user;
			}
		

Композиция работает

			for (let user of getNames(isAdult(users))) {
			  render(user);
			}
		

События — асинхронная коллекция

async iteraton

			async function* getCompanies() {
			  for (let name of ['Alex', 'Ann', 'Vlad']) {
			    const profile = await get(`/users/${name}`);
			    yield profile.company;
			  }
			}
		
			for await (let company of getCompanies()) {
			  console.log(company);
			}
		

Ссылки

Что почитать

Спасибо за внимание!

Ссылка на эти слайды:
alexeyraspopov.github.io/es-async-future