Алексей Распопов "Будущее асинхронного...

Preview:

Citation preview

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

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

2

whoami

— 5 лет двигаю кнопки на 3px влево

— Разработчик в DataRobot

— Храню личный говнокод на ГитХабе

3

Побочные эффекты (side effects)Общение с другими сервисами/базами данных, события в

окружении, прочее.

4

5

АсинхронноепрограммированиеТип параллельных вычислений, который подразумевает, что

операция может быть выполнена кем-то на стороне, за пределами

текущего вычислительного устройства.

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

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

6

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

— HTTP запросы

— Работа с файловой системой

— Таймеры

— События системы и пользователя

— Worker'ы

— ...

7

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

8

9

10

Promise?

11

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

12

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

13

.then(

get('/resources', (resources) => {

renderResources(resources);

});

get('/resources') (resources) => {

renderResources(resources);

});

01.

02.

03.

01.

02.

03.

14

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

15

resources

error

// wow

function main() {

try {

let = getResources();

render(resources);

} catch ( ) {

}

}

01.

02.

03.

04.

05.

06.

07.

08.

16

resources

error

// wow

function main() {

getResources()

.then(( ) => {

render(resources);

})

.catch(( ) => {

})

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

17

18

resources

error

// wow

.finally

// hell yeah

function main() {

getResources()

.then(( ) => {

render(resources);

})

.catch(( ) => {

})

(() => {

})

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12. 19

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

20

Антипаттерны и сложности— Размытие сложности по модулю

— Все еще есть задачи в которых приходится писать вложенные

промисы

— Сколько раз вы гуглили статьи по вопросам использования

промисов?

21

Хорошие практики— Переносимость кода

— Поддержка return

— Отсутствие вложенности в 99% случаев

22

ECMAScript 20XX

23

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

24

async/await

25

Асинхронные функции— Есть в других языках (C#, Python 3.5)

— Поддерживает стандартные операторы языка

— Композиция все еще работает

26

resources

error

// wow

function main() {

try {

let = getResources();

render(resources);

} catch ( ) {

}

}

01.

02.

03.

04.

05.

06.

07.

08.

27

async

resources await

error

// wow

function main() {

try {

let = getResources();

render(resources);

} catch ( ) {

}

}

01.

02.

03.

04.

05.

06.

07.

08.

28

async

await

// ...

return

function a() {

let status;

do {

status = get('/status');

} while (status !== 'COMPLETED');

result;

}

01.

02.

03.

04.

05.

06.

07.

08.

29

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

30

Генераторы и итераторыfunction* numbers() {

yield 1;

yield 2;

return 3;

}

01.

02.

03.

04.

05.

31

.next() // 1

// 2

// 3

const iterator = numbers();

iterator ;

iterator.next();

iterator.next();

01.

02.

03.

04.

32

function*

yield

yield

Корутиныco( () {

var str = read(‘secret-passwords.txt’);

str = str.replace(‘qwerty’, ‘123456’);

write(‘new-passwords.txt’, str);

});

01.

02.

03.

04.

05.

33

npm install co

34

browserify code.js> bundle.js

35

co.wrap (name)

// ...

// wow

Async/await уже сегодняconst getResources = (function* {

try {

const data = yield fetch(̀/resources/${name}̀);

return result;

} catch (error) {

}

});

01.

02.

03.

04.

05.

06.

07.

08.

09.36

37

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

38

Еще больше интерфейсов[1, 2, 3, 4]

.map(n => n * 3)

.filter(n => n < 10)

01.

02.

03.

39

Что не так?— Жрущие память промежуточные результаты

— Еще один интерфейс

40

yield

yield

Можно использовать итераторfunction* getNames(users) {

for (let user of users)

user.name;

}

function* isAdult(users) {

for (let user of users)

if (user.age > 18) user;

}

01.

02.

03.

04.

01.

02.

03.

04. 41

Композиция работаетfor (let user of getNames(isAdult(users))) {

render(user);

}

01.

02.

03.

42

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

43

async iteraton

44

async

await

yield

function* getCompanies() {

for (let name of ['Alex', 'Ann', 'Vlad']) {

const profile = get(̀/users/${name}̀);

profile.company;

}

}

01.

02.

03.

04.

05.

06.

45

for await (let company of getCompanies()) {

console.log(company);

}

01.

02.

03.

46

Ссылки— ECMAScript status, process, and documents

— Async/await for ECMAScript

— Asynchronous Iteration for ECMAScript

47

Что почитать— TJ Holowaychuk: Callbacks vs Coroutines

— Jake Archibald: ES7 Async Functions

— Dr. Axel Rauschmayer: What’s in ECMAScript 2016 (ES7)?

— Dr. Axel Rauschmayer: ES6 generators in depth

48

49

Спасибо за внимание!— twitter.com/alexeyraspopov

— github.com/alexeyraspopov

Ссылка на эти слайды:

alexeyraspopov.github.io/es-async-future

50

Recommended