Введение в JavaScript
(часть 3)
Лыкошин Александр
2020-24
## Содержание - Синхронное и асинхронное выполнение кода - Callbacks - node: error-first callback - Спагетти-код (spaghetti-code) - Библиотека async.js - Promises - async/await - Примеры методов модуля `fs` Node.js с синхронным выполнением, callback, Promise; поочередное и параллельное выполнение
## Библиотека `async.js` - Async состоит из порядка 70 functions, включающих обычные "функциональные" методы (map, reduce, filter, each…), а также распространенные паттерны асинхронного выполнения (parallel, series, waterfall…). - Все эти функции предполагают следование соглашению Node.js передавать функциям один callback в качестве последнего аргумента асинхронной функции - callback, который ожидает `Error` в качестве первого аргумента и будет вызван ровно один раз. - [Документация](https://caolan.github.io/async/)
## Пример (1) Выполнить асинхронную функцию для массива данных ```js async.map(['file1','file2','file3'], fs.stat, function(err, results) { // results is now an array of sstats for each file }); ``` ```js async.filter(['file1','file2','file3'], function(filePath, callback) { fs.access(filePath, function(err) { callback(null, !err) }); }, function(err, results) { // results now equals an array of the existing files }); ```
## Пример (2) Выполнить функции из массива параллельно. Вернуть результаты их выполнения в виде массива в последнем callback, либо ошибку,если любая из функций вернула ошибку в callback. ```js async.parallel( [ function(callback) { setTimeout(function() { callback(null, 'one'); }, 200); }, function(callback) { setTimeout(function() { callback(null, 'two'); }, 100); } ], // optional callback function(err, results) { // the results array will equal ['one','two'] even though // the second function had a shorter timeout. } ); ```
## Пример (3) Выполнить функции из массива последовательно. Вернуть результаты их выполнения в виде массива в последнем callback, либо ошибку,если любая из функций вернула ошибку в callback. ``` async.series( [ function(callback) { // do some stuff ... callback(null, 'one'); }, function(callback) { // do some more stuff ... callback(null, 'two'); } ], // optional callback function(err, results) { // results is now equal to ['one', 'two'] } ); ```
## Пример (4) Выполнить функции из массива последовательно, передавая результат каждой из них следующей. Вернуть результаты их выполнения в виде массива в последнем callback, либо ошибку,если любая из функций вернула ошибку в callback. ``` async.waterfall( [ function(callback) { callback(null, 'one', 'two'); }, function(arg1, arg2, callback) { // arg1 now equals 'one' and arg2 now equals 'two' callback(null, 'three'); }, function(arg1, callback) { // arg1 now equals 'three' callback(null, 'done'); } ], function (err, result) { // result now equals 'done' } ); ```
# Promise ___ - [Using Promises - MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises) - [Promise - MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
## Promise - состояния - `pending`: начальное (initial) состояние, не fulfilled (выполнено) и не rejected (отклонено). - `fulfilled`: означает, что операция была выполнена успешно. - `rejected`: означает, что операция была неуспешна.
## Promise - Методы объекта - `promise.then()` - `promise.catch()` - `promise.finally()`
## Promise - Статические методы (1) - `Promise.all(iterable)` Wait for all promises to be resolved, or for any to be rejected. If the returned promise resolves, it is resolved with an aggregating array of the values from the resolved promises, in the same order as defined in the iterable of multiple promises. If it rejects, it is rejected with the reason from the first promise in the iterable that was rejected. - `Promise.allSettled(iterable)` Wait until all promises have settled (each may resolve or reject). Returns a Promise that resolves after all of the given promises have either resolved or rejected, with an array of objects that each describe the outcome of each promise. - `Promise.any(iterable)` Takes an iterable of Promise objects and, as soon as one of the promises in the iterable fulfills, returns a single promise that resolves with the value from that promise. - `Promise.race(iterable)` Wait until any of the promises is resolved or rejected. If the returned promise resolves, it is resolved with the value of the first promise in the iterable that resolved. If it rejects, it is rejected with the reason from the first promise that was rejected.
## Promise - Статические методы (2) Promise.resolve() and Promise.reject() are shortcuts to manually create an already resolved or rejected promise respectively. This can be useful at times. - `Promise.reject(reason)` - Returns a new Promise object that is rejected with the given reason. - `Promise.resolve(value)` Returns a new Promise object that is resolved with the given value. If the value is a thenable (i.e. has a then method), the returned promise will "follow" that thenable, adopting its eventual state; otherwise, the returned promise will be fulfilled with the value.
## Спасибо за внимание #### Вопросы..?