#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);
}