Axios承诺所有

omqzjyyz  于 2022-11-05  发布在  iOS
关注(0)|答案(8)|浏览(173)

我刚刚读了一篇关于Promise的文章,无法理解我们如何通过Promise使用Axios进行多个API调用。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本身就有一个承诺(或者至少我是这样使用它的)。

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

**问题:**有人能告诉我如何使用promise.all和axios发送多个请求吗

eufgjt7s

eufgjt7s1#

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

i34xakig

i34xakig2#

fetchData(URL)函数发出网络请求,并返回状态为待定的承诺对象。
Promise.all将等待,直到所有的承诺都解决或任何承诺被拒绝。它返回一个承诺和解决响应数组。
第一个

bnlyeluc

bnlyeluc3#

您仍然可以使用promise.all,并将promises数组传递给它,然后等待所有promises得到解析或其中一个promises被拒绝。

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

v2g6jxz64#

只是为了补充已批准的答案,axios也有Promise.all的形式,它期望一个承诺列表,并返回一个响应数组。

let randomPromise = Promise.resolve(200);
axios.all([
    axios.get('http://some_url'),
    axios.get('http://another_url'),
    randomPromise
  ])
  .then((responses)=>{
    console.log(responses)
  })
8i9zcol2

8i9zcol25#

希望这对你有帮助

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

fafcakar6#

使用Promise.allSettled,它几乎与Promise.all相同,但如果任何承诺被拒绝,它不会作为一个整体拒绝。Promise.allSettled只是等待所有承诺得到解决,而不管结果如何。

const [ first, second, third ] = await Promise.allSettled([
  fetch('https://jsonplaceholder.typicode.com/todos/'),
  fetch('https://jsonplaceholder.typicode.com/todos/'),
  fetch('https://jsonplaceholder.typicodecomtodos')
])

// P.S: you can replace fetch with axios

结果数组具有:

  • { status:"fulfilled", value:result }表示成功响应
  • { status:"rejected", reason:error }表示错误。

tvz2xvvm

tvz2xvvm7#

应该可以这样做:

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]);
zfycwa2u

zfycwa2u8#

// using axios return
const promise0 = axios.get( url )
  .then( function( response ) {
    return response
  } )

// using function new promise
function promise1() {
  return new Promise( ( resolve, reject ) => {
    const promise1 = axios.get( url )
      .then( function( response ) {
        return response
      } )    
    resolve( promise1 )  
  ) }
}

Promise.all( [promise0, promise1()] ).then( function(results) {
  console.log(results[0]);
  console.log(results[1]);
});

相关问题