AsyncJS
Lesson 1
JavaScript
// fetchData Получает данные с сервиса и обрабатывает ошибки
// @pamam {function} resove - колбек, возвращает данные
// @pamam {function} reject - колбек, возвращает ошибку
function fetchData(resolve, reject){
// Эмулируем случайную задержку получения данных с бэка 0..1000мс
setTimeout(()=>{
// Получаемые данные
const data = {
// Случайное число 0..9
value: Math.floor(Math.random() * 10)
};
// с вероятностью 0.9 вернем данные, либо ошибку
if (Math.random() < 0.9)
resolve(data);
else
reject(500, 'Cannot fetch data')
},Math.floor(Math.random() * 1000))
}
// Выполняем функцию
fetchData(
// колбек resolve
data=>{ console.log('data is ok', data) },
// колбек reject
(errorCode, errorMsg)=>{ console.error(errorCode, errorMsg) }
);
// Выполнить можно и по-другому
// Определим функции resolve и reject отдельно
// и передадим их в качестве аргументов в fetchData
function resolve(data){
console.log('data is ok', data);
};
function reject(errorCode, errorMsg){
console.error(errorCode, errorMsg)
};
fetchData(resolve, reject);
/*
// Теперь получим все данные асинхронно и и вернем их списком
// Асинхронное получение данных используется там, где запросчики независимы друг от друга
// Например, мы стучимся к разным эндпойнтам бэкенда путем get-запроса:
// get('/users'), get('/dictionaties')
// @param {array} fetchersList - массив запросчиков
// @param {function} callback - возвращает данные
function getAllDataAsync(fetchersList, callback){
const result = [];
fetchersList.forEach((f, i)=>{
// Вызываем каждю функцию и пушим данные в хранилище
// Если данные без ошибки, то пушим ok = true, в противном случае false
// Также отправляем идентификатор функции (чтобы как-то различать их)
f(
data=>{
result.push({ i, ok: true, value: data.value });
// Поскольку мы пушим данные в любом случае, то знаем,
// что длина результирующего массива равняется длине fetchersChain
// По...