Promise.all() с динамически изменяемым массивом запросов с использованием await

#javascript #node.js #async-await #es6-promise

#javascript #node.js #async-await #es6-обещание

Вопрос:

Я новичок в JavaScript и Promises. Мне нужно отправить массив запросов с использованием Promise.all and await . К сожалению, я не знаю размер массива, поэтому он должен быть динамическим. Массивом будут запросы. Пример:

 let arrayOfApiCreateRecords = [];
arrayOfApiCreateRecords.push(apiCreateRecords(req, { clientHeaders: headers, record }));
let responses = await Promise.all( arrayOfApiCreateRecords );
 

Я пытался написать свой код таким образом, но, похоже, я застрял. Можно ли переписать код с использованием Promise.all и await с динамическим массивом запросов? Пожалуйста, сообщите. Ниже то, что у меня есть:

 'use strict';

const { apiCreateRecords } = require('../../../records/createRecords');

const createRecords = async (req, headers) => {
  let body = [];
  let status;
  for(let i = 0; i < req.body.length; i  ) {
    let r = req.body[i];
    let record = {
      recordId: r.record_Id,
      recordStatus: r.record_status,
    };
    const response = await apiCreateRecords(req, { clientHeaders: headers, record });
    status = (status != undefined || status >= 300) ? status : response.status;
    body.push(response.body);
    };
  return { status, body };
};

module.exports = {
  createRecords,
};
 

Комментарии:

1. Это именно то Promise.all() , для чего нужно. Массив может быть любого размера.

2. Помещайте обещания в массив в цикле, затем вызывайте Promise.all() , когда цикл завершен.

3. @Barmar разве это не вызовет все обещания? Я хотел, чтобы они выполнялись все сразу.

4. «обещания вызова»? wdym?

5. Обещания начинают выполняться при вызове асинхронных функций. Promise.all() предназначен для ожидания разрешения всех из них.

Ответ №1:

Хорошо, я собираюсь использовать fetch API для демонстрации использования Promise.all()

Обычное использование (для одного fetch вызова)

 let user = { username: 'john.doe', password: 'secret' };

try{
    let res = await fetch('https://example.com/user/', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(user)
    })

    console.log('User creation response: ', res);
}
catch(err){
    console.error('User creation error: ', err);
}
 

Теперь давайте используем Promise.all()

 const users = [
    { username: 'john.doe', password: 'secret' },
    { username: 'jane.doe', password: 'i-love-my-secret' }
];

const requests = [];

// push first request into array
requests.push(
    fetch('https://example.com/user/', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(user[0])
    })
);

// push second request into array
requests.push(
    fetch('https://example.com/user/', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(user[1])
    })
);

try{
    const responses = await Promise.all(requests);

    console.log('User creation responses: ', responses);
}
catch(err){
    console.log('User creation error: ', err);
}