Вызов нескольких асинхронных вызовов в цикле не работает должным образом

Я сопоставляю массив, а затем вызываю три асинхронных вызова, которые возвращают информацию о параметрах, чтобы сделать другой вызов. Я хочу, чтобы код принимал по одной учетной записи за раз и выполнял каждый асинхронный вызов, прежде чем перейти к следующей учетной записи в массиве. Проблема в том, что сейчас код запускает все учетные записи через первый асинхронный вызов, затем переходит ко второму асинхронному вызову, который запускает все учетные записи, и то же самое для третьего. Вот что я пробовал до сих пор:

const request = require('request')
const delay = (ms) => {
  return new Promise((resolve) => {
    setTimeout(resolve, ms)
  })
}

async function report(){
  let accounts = await getAccountsForTimezone('Eastern Time (US & Canada)');
  const promises = accounts.map((account) => {
      return new Promise(async (resolve, reject) => {
        await delay(1000)  
        const param1 = await scope1(account)
        const param2 = await scope2(account)
        const param3 = await scope3(account)
        const response = insertData(param1, param2, param3).catch(reject)
        resolve(response)
     })
  })
};

Я также пробовал:

async function report(){
  let accounts = await getAccountsForTimezone('Eastern Time (US & Canada)');
  const promises = accounts.map((account) => {
      return new Promise(async (resolve, reject) => {
        await delay(1000)
        const reults = Promise.all([await scope1(account), await scope2.apply(account), scope3.apply(account)])

        const response = insertData(param1, param2, param3).catch(reject)
        resolve(response)
     })
  })
};

I expect the loop to look like: Account 1 ->param1 ->param2 ->param3

Account 2 ->param1 ->param2 ->param3

Instead I get: Account 1 ->param1 Account 2 ->param1

Account 1 ->param2 Account 2 ->param2

Account 1 ->param3 Account 2 ->param3

если вы хотите, чтобы обещания accounts.map выполнялись последовательно, вам нужно запускать их последовательно, например, используя for...in или for...of

Jaromanda X 10.04.2019 06:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы не используете возврат promises в accounts.map, нет причин использовать карту вообще.

простой цикл for...of, вероятно, то, что вам нужно

async function report(){
  let accounts = await getAccountsForTimezone('Eastern Time (US & Canada)');
  for (const account of accounts) {
    await delay(1000)  
    const param1 = await scope1(account)
    const param2 = await scope2(account)
    const param3 = await scope3(account)
    const response = insertData(param1, param2, param3).catch(reject)
  }
};

Другие вопросы по теме