ES6 generators или promises?

Полгода назад разбирался с синхронным js в node.js. В тот раз вполне устроили генераторы и tj/co. Плюс помог модуль co-chan. Теперь настала пора делать новый проект и все, что я смог найти бодро развернулось в сторону promises. Даже в co еще поздней осенью мейнтейнеры говорили, что мол, только генераторы, никаких promises. Затем вышла версия 4.0, в которой promises стали основой технологией в co (хотя он и поддерживает thunks).

Собственно вопрос - я правильно вижу ситуацию, в которой генераторы открыто сливают, а про yield в js можно забыть? Да и про красивый синхронный стиль в общем тоже. Потому как promises через полгода окончательно завоюют javascript и в то же время не дают серьезных премуществ по сравнению со старым способом, как например библиотеки типа async или даже классический коллбек-хелл (который совсем не хелл с неанонимными функциями):
db.query('select ...', afterFirstQuery);
function afterFirstQuery(err, result) {
    //...
    db.query('insert...', afterSecondQuery);
}
function afterSecondQuery(err, result){...}

Спасибо.
  • Вопрос задан
  • 5496 просмотров
Решения вопроса 2
jusio
@jusio
Senior Software Engineer at Restlet
Генераторы отлично дружат с promise.

Pure Promises:

fetchUser().then(function(user){
   return fetchUserPosts(user.id);
})

Promises+Generators (Пример из Q):
Q.spawn(function*(){
   var user = yield fetchUser(); 
   var userPosts = yield  fetchUserPosts(user.id);
   return userPosts;
});


Никто не собирается сливать генераторы.
Ответ написан
@VitalyT
Если вы разрабатываете для PostgreSQL, то вы можете воcпользоваться pg-promise, в которой промисы и генераторы работают вместе превосходно, и тогда вам не нужно делать какой-либо жесткий выбор, а можно свободно комбинировать:

db.task(function*(t) {
        let firstResult = yield t.query('SELECT...');
        let secondResult = yield t.query('SELECT...');
        // etc...

        return {firstResult, secondResult};
    })
    .then(function (data) {
        // data.firstResult, data.secondResult;
    });

так-же см.: SELECT ⇒ INSERT
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wallride
@wallride
Виртуализирую вселенную.
Ну не знаю. А как насчёт выброса ексепшнов в промисах? Разве возможно?
Я возлюбил генераторы именно за эту фичу - эксепшны "всплывают" наверх из функций, вызываемых через yield.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы