Я пытаюсь создать универсальные функции, которые выравнивают количество обещаний, выполняющихся параллельно.основная тема - управление вызовами API Google, чтобы избежать достижения квот, определенных Google.
Я создаю массив значений.Затем я перебираю этот массив и создаю массив Обещаний.Каждое обещание вызывает функцию со значением в качестве аргумента.Наконец, я запускаю файл promise.all для каждого куска ожидающих обещаний X
К сожалению, при создании массива ожидающих обещаний выполняется функция, переданная в качестве аргумента.В результате управление параллельным выполнением через Promise.all бесполезно.
Ниже приведен код.Rgds
функция, которая создает массив обещаний с функцией в качестве аргумента
const createArrayOfFunctionPromise = <T>(
arrayVal: T[],
functionToExecute: (...args: any[]) => any
): Array<Promise<T[]>> => {
const resu: Array<Promise<T[]>> = [];
arrayVal.forEach((val: T, index: number) => {
resu.push(functionToExecute(val, index));
});
return resu;
};
Функция, которая выполняет массив обещаний по фрагменту
const executeArrayOfFunctionPromiseByChunk = async <T>(
arrValue: T[],
functionToExecute: (...args: any[]) => any,
chunk?: number
): Promise<T[]> => {
const arrP: Array<Promise<T[]>> = createArrayOfFunctionPromise<T>(
arrValue,
functionToExecute
);
let data: T[][] = [];
if (chunk) {
if (chunk > 0) {
let tmpArr: Array<Promise<T[]>> = [];
for (let i: number = 0; i < arrP.length; i += 1) {
tmpArr.push(arrP[i]);
if (i % chunk === 0 || i === arrP.length - 1) {
const d = await Promise.all(tmpArr);
data.push(d.flat(1));
tmpArr = [];
}
}
} else {
return [];
}
} else {
data = await Promise.all(arrP);
}
// console.log(data);
return data.flat(1);
};
пример функции для выполнения
const dummyFunction = async (val: string, index: number): Promise<string[]> => {
let resu: string[] = [];
resu = [...resu, await dummyPromise<string>(`${val} appel 1`, index)];
resu = [...resu, await dummyPromise<string>(`${val} appel 2`, index + 0.5)];
resu = [...resu, await dummyPromise<string>(`${val} appel 3`, index + 1.2)];
resu = [...resu, await dummyPromise<string>(`${val} appel 4`, index + 1.7)];
resu = [...resu, await dummyPromise<string>(`${val} appel 5`, index + 0.7)];
return resu;
};
const dummyPromise = async <T>(param: T, index: number): Promise<T> => {
return new Promise(resolve => {
setTimeout(() => resolve(param), 3 * index * 1000);
console.log("dans dummypro", 3 * index * 1000);
});
};
для запуска тестовой программы - следует выполнить функцию dummyFunction 2 на 2 (chunk =2) при зацикливании массива из 3 элементов
const test = async (array: string[]): Promise<string[]> => {
const result: string[] = await executeArrayOfFunctionPromiseByChunk<string>(
array,
dummyFunction,
2
);
return result;
};
test(["a", "b", "c"]).then((result: string[]) => {
console.log(result.flat(1));
});