Обещать всем с Axios
Я просто прочитал статью, связанную с обещанием, и не смог понять, как мы можем выполнять множественный вызов API с помощью Axios через Promise.all
Поэтому рассмотрим, что есть 3 URL-адреса, позволяет называть это чем-то вроде этого
let URL1 = "https://www.something.com"
let URL2 = "https://www.something1.com
let URL3 = "https://www.something2.com"
И массив, в котором мы будем хранить Value
let promiseArray = []
Теперь я хочу запустить это параллельно (Promise.all
), но я не могу понять, как мы это сделаем? Потому что у аксиомов есть само обещание (или, по крайней мере, то, как я его использовал).
axios.get(URL).then((response) => {
}).catch((error) => {
})
Вопрос: Может кто-нибудь, пожалуйста, скажите мне, как мы можем отправить несколько запросов с помощью prom.all и axios
Ответы
Ответ 1
Метод axios.get()
вернет обещание.
Promise.all()
требует массива обещаний. Например:
Promise.all([promise1, promise2, promise3])
Ну тогда...
let URL1 = "https://www.something.com"
let URL2 = "https://www.something1.com"
let URL3 = "https://www.something2.com"
const promise1 = axios.get(URL1);
const promise2 = axios.get(URL2);
const promise3 = axios.get(URL3);
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
Вы можете задаться вопросом, как выглядит значение ответа Promise.all()
. Что ж, тогда вы можете легко понять это сами, взглянув на следующий пример:
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
Для получения дополнительной информации: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
Ответ 2
Функция fetchData(URL)
делает сетевой запрос и возвращает объект обещания с ожидающим статусом.
networkRequestPromises
содержит массив ожидающих обещаний, которые были возвращены функцией getData.
Promise.all
будет ждать, пока все обещания не будут выполнены или любое обещание будет отклонено. Он возвращает обещание и решает с массивом ответов.
let URLs= ["https://jsonplaceholder.typicode.com/posts/1", "https://jsonplaceholder.typicode.com/posts/2", "https://jsonplaceholder.typicode.com/posts/3"]
async function getAllData(URLs){
let networkRequestPromises = URLs.map(fetchData);
return await Promise.all(networkRequestPromises);
}
function fetchData(URL) {
return axios
.get(URL)
.then(function(response) {
return {
success: true,
data: response.data
};
})
.catch(function(error) {
return { success: false };
});
}
getAllData(URLs).then(resp=>{console.log(resp)}).catch(e=>{console.log(e)})
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
Ответ 3
Просто чтобы добавить к утвержденному ответу, аксиомы также имеют свой Promise.all
в форме axios.all
он ожидает список обещаний и возвращает массив ответов.
let randomPromise = Promise.resolve(200);
axios.all([
axios.get('http://some_url'),
axios.get('http://another_url'),
randomPromise
])
.then((responses)=>{
console.log(responses)
})
Ответ 4
Вы все еще можете использовать promise.all
с массивом обещаний, переданных ему, а затем ждать, пока все они будут разрешены или один из них будет отклонен.
let URL1 = "https://www.something.com";
let URL2 = "https://www.something1.com";
let URL3 = "https://www.something2.com";
const fetchURL = (url) => axios.get(url);
const promiseArray = [URL1, URL2, URL3].map(fetchURL);
Promise.all(promiseArray)
.then((data) => {
data[0]; // first promise resolved
data[1];// second promise resolved
})
.catch((err) => {
});
Ответ 5
Что-то вроде этого должно работать:
const axios = require('axios');
function makeRequestsFromArray(arr) {
let index = 0;
function request() {
return axios.get('http://localhost:3000/api/' + index).then(() => {
index++;
if (index >= arr.length) {
return 'done'
}
return request();
});
}
return request();
}
makeRequestsFromArray([0, 1, 2]);
Ответ 6
Надеюсь, это поможет
var axios = require('axios');
var url1 = axios.get('https://www.something.com').then(function(response){
console.log(response.data)
})
var url2 = axios.get('https://www.something2.com').then(function(response){
console.log(response.data)
})
var url3 = axios.get('https://www.something3.com').then(function(response){
console.log(response.data)
})
Promise.all([url1, url2, url3]).then(function(values){
return values
}).catch(function(err){
console.log(err);
})