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