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
       	// По...