PromisesInSeries
Напишите функцию, которая принимает массив асинхронных функций и последовательно(следующая начинается, когда закончилась предыдущая) вызывает их, передавая в аргументы результат вызова предыдущей функции.
Пример:
const firstPromise = () =>
new Promise((resolve) => setTimeout(() => resolve(300)), 300);
const secondPromise = () =>
new Promise((resolve) => setTimeout(() => resolve(200)), 200);
const thirdPromise = () =>
new Promise((resolve) => setTimeout(() => resolve(100)), 100);
promisesInSeries([firstPromise, secondPromise, thirdPromise]);
Выполнит resolve(300) через 300 мс, потом resolve(200) через 200 мс, потом resolve(100) через 100 мс
[Array.prototype, ...[function* () {}, async function* () {}]
.map(Object.getPrototypeOf)
.map(f => f.prototype)]
.map(p => Object.assign(p, {
async *mapAsync(fn) {
let i = 0
for await(const v of this)
yield fn(v, i++)
},
async *filterAsync(fn) {
for await(const v of this)
if ( fn(v) )
yield v
},
async toArrayAsync() {
const a = []
for await(const v of this)
a.push(v)
return a
},
}))
/////////////
const firstPromise = () =>
new Promise((resolve) => setTimeout(() => resolve(300), 300));
const secondPromise = () =>
new Promise((resolve) => setTimeout(() => resolve(200), 200));
const thirdPromise = () =>
new Promise((resolve) => setTimeout(() => resolve(100), 100));
[firstPromise, secondPromise, thirdPromise]
.mapAsync(f => f())
.mapAsync(v => console.log(v))
.toArrayAsync()