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)