typcript: асинхронная функция в качестве аргумента другой функции выполняется вместо ожидающей - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь создать универсальные функции, которые выравнивают количество обещаний, выполняющихся параллельно.основная тема - управление вызовами 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));
  });
...