Javascript - Использование генераторов вместо обещаний

Предположим, у меня есть следующие функции:

var f1 = function() {
    console.log('running f1');
    return new Promise(function(res, rej) {
        setTimeout(() => res('resolved_1!'), 1000);
    });
};

var f2 = function(a) {
    console.log('running f2 with ' + a);
    return new Promise(function(res, rej) {
        setTimeout(() => res('resolved_2!'), 2000);
    });
};

var f3 = function() {
    console.log('running f3');
    return new Promise(function(res, rej) {
        setTimeout(() => res('resolved_3!'), 3000);
    });
};

Я могу запустить их с:

let t1 = +new Date;
Promise.all([
    f1().then(a => {
        return f2(a);
    }),
    f3()
]).then((result) => {
    let t2 = +new Date;
    console.log(t2 - t1);
});

И это занимает примерно 3 секунды.

Теперь я хочу запустить эти функции с помощью генераторов:

let t1 = +new Date;
let result = yield [f1(), f3()];
yield f2(result[0]);
let t2 = +new Date;
console.log(t2 - t1)

Поскольку мне нужно разрешить значение f1 для вызова f2, я буду ждать завершения f1. Это занимает 5 секунд. Как я могу получить те же 3 секунды, но используя генераторы?

1 ответ

Решение

Это занимает 5 секунд.

См. Замедление из-за непараллельного ожидания обещаний в асинхронных генераторах.

Как я могу получить те же 3 секунды, но используя генераторы?

Вы просто должны выразить тот же поток управления:

let t1 = +new Date;
let result = yield [f1().then(f2), f3()];
let t2 = +new Date;
console.log(t2 - t1)

Если вы хотите избежать then по какой-то причине, и вместо этого использовать генераторы, это должно быть

let t1 = +new Date;
let result = yield [co(function*() {
    var a = yield f1();
    return yield f2(a); // yield is optional here
}), f3()];
let t2 = +new Date;
console.log(t2 - t1)
Другие вопросы по тегам