Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
.catch(function(e){
// do something
throw e;
})
getTokenInfoFor(token).then(function(tokenInfo){
getUserInfo(tokenInfo.email).then(function(userInfo){
if (userInfo.tokenRevokeTime > tokenInfo.issueTime)
return Q.resolve(userInfo);
else
return Q.reject(errors.tokenRevoked);
});
});
co(function*(){
var tokenInfo = yield getTokenInfoFor(token);
var userInfo = yield getUserInfo(tokenInfo.email);
if (userInfo.tokenRevokeTime > tokenInfo.issueTime)
throw e;
return userInfo;
})(function(err, res){
...
});
// все нужные require
// co + генераторы
var countFiles = co(function* (dir) {
var files = yield fs.readdirSync(dir);
var paths = _.map(files, function (file) { return path.join(dir, file); });
var stats = yield _.map(paths, function (path) { return fs.statAsync(path); });
return _.filter(stats, function (stat) { return stat.isFile(); }).length;
});
// async/await
var countFiles = async.cps (function (dir) {
var files = await (fs.readdirSync(dir));
var paths = _.map(files, function (file) { return path.join(dir, file); });
var stats = await (_.map(paths, function (path) { return fs.statAsync(path); }));
return _.filter(stats, function (stat) { return stat.isFile(); }).length;
});
Как можно радоваться от промисов при виде этого стройного кода я не понимаю.
var files = await promiseFs.readdir(dir)
, paths = files.map((file)=> path.join(dir, file))
, stats = await Promise.all(paths.map((path)=> promiseFs.stat(path)))
, countFiles = stats.filter((stat)=> stat.isFile()).length;
async / await, что грозятся попасть в ES7, базируется как раз на связке генераторов и промисов.Промисы хороши там, где идет цепочечная обработка данных
getTokenInfoFor(token).then(function(tokenInfo){
return getUserInfo(tokenInfo.email).then(function(userInfo){ // подменяем результат выполнения первого промиса вторым
if (userInfo.tokenRevokeTime < tokenInfo.issueTime) throw errors.tokenRevoked; // выброс ошибки приведет к reject всех промисов ниже по цепи
return userInfo; // отдаем это как результат второго промиса
});
})
.then(function(userInfo){ ... })
.catch(function(rejection){ ... });
function getUserInfoByToken( token ) {
var tokenInfo = getTokenInfoFor(token);
var userInfo = getUserInfoByMail(tokenInfo.email);
if (userInfo.tokenRevokeTime > tokenInfo.issueTime)
throw e;
return userInfo;
}
var tokenInfo = getTokenInfoFor(token),
userInfo = tokenInfo.then(function(tokenInfo){
return getUserInfo(tokenInfo.email)
});
Q.all(tokenInfo, userInfo).spread(function(tokenInfo, userInfo){
if (userInfo.tokenRevokeTime > tokenInfo.issueTime)
return Q.resolve(userInfo);
else
return Q.reject(errors.tokenRevoked);
});
Попробуйте разрулить нетривиальный поток выполнения на callbacks, желательно с обработкой ошибок, если вы не напишете свою имплементацию Promises, код, скорее всего, будет невозможно читать и понимать
let deferred1=$.deferred(), deferred2=$.deferred();
function callbackFn1(arr){
…//обработка ответа № 1 сервера
deferred1.resolve(arr);
}
function callbackFn2(arr){
…//обработка ответа № 2 сервера
deferred2.resolve(arr);
}
function callbackFn3(arr1, arr2){
…//обработка, которой нужно оба ответа сервера
}
$.deferred().when(deferred1, deferred2).then(callbackFn3);
//в какой-то момент инициируется запрос № 1
$.request(AJAX-запрос_1, callbackFn1);
//а в какой-то другой момент независимо инициируется запрос № 2
$.request(AJAX-запрос_2, callbackFn2);
// первый ленивый загрузчик данных
var first = $jin.atom.prop({
pull: atom => {
$.request(AJAX-запрос_1, arr => atom.push( arr ) )
throw new $jin.atom.wait( 'Request 1' )
}
})
// второй ленивый загрузчик данных
var second = $jin.atom.prop({
pull: atom => {
$.request(AJAX-запрос_2, arr => atom.push( arr ) )
throw new $jin.atom.wait( 'Request 2' )
}
})
// ленивый запускатель обеих реквестов параллельно и рендерер результата в документ
var result = $jin.atom.prop({
pull: atom => {
var data = $jin.atom.get([ first , second ])
return data[0].concat( data[1] )
},
notify: ( atom , next ) => document.body.innerHTML = next.join( '|' )
})
// запускаем синхронизацию сервера с клиентом
result.pull()
// обновляем первую пачку данных через 10 секунд
setTimeout( () => first.update() , 10000 )
timeout(Promise.reject(), 1e4).catch(function(){
console.log('Да ладно? Мало того, что зря ждём таймаут, так ещё и unhandled rejection %)');
});
ECMAScript 6 Promises