Вложенные обещания: создание N обещаний на основе массива - PullRequest
1 голос
/ 04 февраля 2020

У меня есть N рабочих пространств. Число N является динамическим c.

Каждое рабочее пространство должно выполнять несколько предопределенных запросов.

В настоящее время я выполняю цикл по массиву рабочих пространств (Synchronously) и выполнение всех запросов с использованием Promise.all() (то есть asynchronous).

Цель : мне нужно выполнить все запросы для всех рабочих пространств асинхронно. Поэтому я хочу избавиться от l oop до go через каждое рабочее пространство. Идеальным результатом был бы массив массивов. Например, если имеется 3 рабочих пространства и 2 запроса, результатом будет [[q1, q2], [q1,q2], [q1,q2]] каждое q1, а q2 - результаты для каждого рабочего пространства.

Ниже приведен пример кода:

async function fetchingWorkspaceLogs (workspaceId) {
  // Defining q1QueryString, q2QueryString so on...
  // for azure "loganalytics" reader.
  const [q1Result, q2Result, q3Result] = await Promise.all([
    logAnalyticsReader.query(
      q1QueryString,
      workspaceId
    ),
    logAnalyticsReader.query(
      q2QueryString,
      workspaceId
    ),
  ])
// return some promises
}

// Parse all workspaces for query
for (let j = 0; j < workspaceIdList.length; j++) {
  workspaceId = workspaceIdList[j]
  const queryResults = await fetchingWorkspaceLogs(workspaceId)
  q1QueryResults = queryResults[0]
  q2QueryResults = queryResults[1]
}

Как я могу создать еще один объект обещания, чтобы сделать его asyn c?

Не стесняйтесь спрашивать, нужно ли вам что-нибудь еще, чтобы получить больше ясности.

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

вам нужно использовать функцию .map ().

1 голос
/ 04 февраля 2020

Если я вас правильно понимаю, вы можете map(), который превращает массив рабочих пространств в массив Promises и заключать его в Promise.all.

Ниже приведен код "псевдо", чтобы подчеркнуть это.

Если это не отражает вашу ситуацию, мне, вероятно, понадобится дополнительная информация.

async function fetchingWorkspaceLogs (workspaceId) {
  const [q1Result, q2Result] = await Promise.all([
    Promise.resolve(`param1: ${workspaceId}`),
    Promise.resolve(`param2: ${workspaceId}`),
  ]);
  // In this example, the function returns the result to make the point of returning Promise with the information
  return Promise.resolve([q1Result, q2Result]);
}

const workspaceIdList = ['workspace1', 'workspace2', 'workspace3'];

(async () => {
  const result = await Promise.all(
    workspaceIdList.map(workspace => fetchingWorkspaceLogs(workspace))
  );

  console.log(result);
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...