使用 Axios Promise一切

IT技术 javascript promise axios
2021-01-30 23:39:23

我刚刚阅读了一篇与 promise 相关的文章,但无法理解我们如何通过 Promise.all 使用 Axios 进行多个 API 调用

所以考虑有 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 本身就有一个Promise(或者至少我是这样使用它的)。

axios.get(URL).then((response) => {
}).catch((error) => {
})

问题:有人可以告诉我我们如何使用 promise.all 和 axios 发送多个请求

6个回答

axios.get()方法将返回一个Promise。

Promise.all()需要一系列Promise。例如:

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

你可能想补充一点,即使一个失败,一切都失败了。
2021-03-18 23:39:23
@RutwickGangurde 不是这种形式stackoverflow.com/a/46086037/5871613任务的处理顺序与我假设的并发执行顺序不同
2021-03-18 23:39:23

fetchData(URL) 函数发出网络请求并返回具有挂起状态的Promise对象。

Promise.all将等到所有Promise都得到解决或任何Promise被拒绝。它返回一个Promise并解决一系列响应。

let URLs= ["https://jsonplaceholder.typicode.com/posts/1", "https://jsonplaceholder.typicode.com/posts/2", "https://jsonplaceholder.typicode.com/posts/3"]

function getAllData(URLs){
  return Promise.all(URLs.map(fetchData));
}

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>

对代码的解释将有助于更好地回答
2021-03-16 23:39:23

您仍然可以使用promise.all传递给它的一系列Promise,然后等待所有Promise都得到解决或其中一个被拒绝。

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) => {
});

只是添加到批准的答案 axios 也有它Promise.all的形式,axios.all它期望一个Promise列表并返回一个响应数组。

let randomPromise = Promise.resolve(200);
axios.all([
    axios.get('http://some_url'),
    axios.get('http://another_url'),
    randomPromise
  ])
  .then((responses)=>{
    console.log(responses)
  })
如何在其中添加身份验证标头?
2021-03-15 23:39:23
2021-04-01 23:39:23
axios.all 在 2017 年被移除,使用 Promise.all 代替。github.com/axios/axios/issues/1042
2021-04-01 23:39:23
axios.all 目前已被文档弃用
2021-04-04 23:39:23

希望这可能会有所帮助

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);
})
麻烦 106 这似乎不是一个正确的答案,您提出个人获取请求,在您的情况下不需要 promise.all。
2021-03-26 23:39:23
同意@barbsan 单独解决每个Promise不是正确的处理方式。Promise.all 有效地将一堆未解决的Promise捆绑到一个未解决的Promise中,该Promise将解决一系列结果。接受的答案是正确的。
2021-03-28 23:39:23
类似的代码在接受的答案中(没有then之后axios.getcatch块)
2021-04-03 23:39:23