AsyncJS

Lesson 2

by evgkch

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) },
);

// Перепишем fetchData так, чтобы c resove и reject можно было обрабатывать
// в методах then и catch соответственно

const Promise = (function(){
	// Private props
	const _callQueue = [];
  let _resolved = void null;
  let _rejected = void null;
  // Private methods
  function _resolve(result){
    _resolved = result;	
  };
  function _reject(err){
    _rejected = err;
  };
  // Constructor
  function Promise(callback){
  	callback(_resolve, _reject);
  };
  // Public methods
  Promise.prototype.then = function(resolve){
  	_callQueue.push(()=>resolve(_resolved))
    return this;
  };
  Promise.prototype.catch = function(reject){
  	_callQueue.push(()=>reject(_rejected))
    return this;
  };
  return Promise;
}())

const myPromise = new Promise((resolve, reject)=>{
	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))
});
console.log(myPromise)
myPromise
	.then(res=>{
  	console.log('Promise result ok');
 ...