Как сделать promise для массива массивов обещаний, но при этом сохранить ссылку на эти массивы? - PullRequest
0 голосов
/ 23 марта 2019

У меня есть следующий код, который работает нормально, и я стремлюсь повысить производительность еще больше, выполняя все обещания вместе, вместо того, чтобы запускать два массива обещаний один за другим.

В следующем фрагменте исходного кода ниже:

    const forms = await Promise.all(formsPromises);
    const responses = await Promise.all(responsesPromises);

Здесь я сначала запускаю массив formsPromises (которые сами работают параллельно друг другу), и как только он закончится, я запускаю другой массив responsesPromises. Интересно, как я мог запустить их все параллельно (responsesPromises не должен ждать завершения formsPromises)

Я рассматривал другие подобные вопросы, но не нашел подходящего способа сделать это, например, там Как сделать promise.all для массива массивов обещаний?

Это потому, что мне все еще нужно сохранять ссылку на все эти результаты по «типу» (form против response обещаний), и я не понимаю, как это возможно при использовании таких методов, как уменьшение и подобное.

    const formsPromises = []; // Will contain Promises
    const responsesPromises = []; // Will contain Promises
    const results = { // Define initial shape of the results (which is what we should get from the API if there were no results)
      items: [],
      answersCsv: [],
      total_items: 0,
      page_count: 0,
      avg_elapsed_seconds: 0,
    };
    const computedResults = []; // Used to calculate statistic data based on all responses

    // XXX Run all promises in parallel
    map(parameters.form_ids_cleaned, (form_id) => {
      // Fetch the form data, necessary during computing in order to resolve refs for multi choices questions
      formsPromises.push(typeformAPI.forms.get({ uid: form_id }));

      // Fetch the responses for the form
      // XXX This will perform a recursive call under the hood if there are many results and no results limit is defined
      responsesPromises.push(fetchFormResponses({
        parameters,
        queryStringParameters: event.queryStringParameters,
        typeFormApiParameters: {
          ...typeFormApiParameters,
          uid: form_id,
        },
        typeformAPI,
      }));
    });
    // ------ HERE ---------
    const forms = await Promise.all(formsPromises);
    const responses = await Promise.all(responsesPromises);

    map(responses, (response, index) => {
      // Compute results for each set of responses (per form), which will bind CSV-friendly fields and computed statistic data
      computedResults.push(computeResults(response, forms[index]));
    });

1 Ответ

3 голосов
/ 23 марта 2019
 const [forms, responses] = await Promise.all([Promise.all(formsPromises), Promise.all(responsesPromises)]);
...