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');
...