axios在一个请求失败时中止所有请求

cyvaqqii  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(614)

我有一行多个未决请求

const requests = [];

requests.push(axios.post('/request1', {moo:1});
requests.push(axios.post('/request2', {moo:2});
requests.push(axios.post('/request3', {moo:3});

Promise.all(requests).then((reponse) => {
    debugger;
}).catch((err) => {
    debugger;
});

如果其中一个失败了,我将尝试放弃所有。不幸的是,如果其中一个失败,下一个请求仍然会发出。
我尝试了一些取消代码,但下一个请求仍然会触发

const requests = [];
const source = axios.CancelToken.source();
const cancelToken = source.token;

requests.push(axios.post('/request1', {moo:1}, {cancelToken} );
requests.push(axios.post('/request2', {moo:2}, {cancelToken} );
requests.push(axios.post('/request3', {moo:3}, {cancelToken} );

Promise.all(requests).then((reponse) => {
    debugger;
}).catch((err) => {
    source.cancel("Request canceled");
    debugger;
});
bjg7j2ky

bjg7j2ky1#

我尝试了一些取消代码,但下一个请求仍然会触发
你在这里开始请求(如果我假设结束 ) 在每行上):

requests.push(axios.post('/request1', {moo:1}, {cancelToken} ));
requests.push(axios.post('/request2', {moo:2}, {cancelToken} ));
requests.push(axios.post('/request3', {moo:3}, {cancelToken} ));

此时,请求正在进行中。 Promise.all 不运行任何东西,它观察已经运行的东西。
使用取消令牌的代码将在您启动拒绝处理程序时尽可能取消请求 Promise.all 的承诺会运行,但除非您连续运行请求(一次一个),否则它们都会在这之前启动。
如果你想把它们串联起来,最简单的方法就是使用 async 功能:

async function postInSeries(iterable) {
    // Does the requests in series
    const results = [];
    for (const request of iterable) {
        results.push(await axios.post(...request));
    }
    return results;
}
// ...
postInSeries([
    ['/request1', {moo:1}],
    ['/request2', {moo:2}],
    ['/request3', {moo:3}],
])
.then(results => {
    // ...use the results...
})
.catch(error => {
    // ...handle/report error...
});

相关问题