Javascript Axios中数组承诺的链接

Javascript Axios中数组承诺的链接,javascript,promise,ecmascript-6,es6-promise,axios,Javascript,Promise,Ecmascript 6,Es6 Promise,Axios,我需要按顺序使用Axios发出一系列请求 let {files} = this.state, requestQueue = []; files.forEach(file => requestQueue.push(makeRequest(file.name))); requestQueue.reduce((curr, next) => { return curr.then(next); }, Promise.resolve()).then((res) => console.l

我需要按顺序使用
Axios
发出一系列请求

let {files} = this.state, requestQueue = [];
files.forEach(file => requestQueue.push(makeRequest(file.name)));
requestQueue.reduce((curr, next) => {
  return curr.then(next);
}, Promise.resolve()).then((res) => console.log(res));
函数makeRequest如下所示

import Axios from 'axios';

let axiosCustom = Axios.create({
  baseUrl: 'localhost:8080',
  headers: {
    Accept: 'application/json'
  }
});

const makeRequest = (title) => {
  return axiosCustom({
    url: '/api',
    method: 'PUT',
    params: {
      title
    }
  });
};

这只是第一个得到解决的问题。如何修复此问题?

我的理解是
。然后()
需要执行一个函数。它的行为将根据该函数的返回值而改变(如果它的

因此,您需要更改reduce以提供
。然后使用将返回
next
的方法返回

let {files} = this.state,
    requestQueue = files.map(file => makeRequest(file.name));

requestQueue.reduce((curr, next) => {
  return curr.then(() => next); // <- here
}, Promise.resolve())
    .then((res) => console.log(res));

这就是同步使用array链接axios的方式

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

实际上,您需要使用
requestQueue.push(()=>makeRequest(file.name))
来完成此任务work@Bergi这将授权创建承诺,但在reduce方面应该具有与我相同的行为。您创建了一个返回承诺的方法,我有一个承诺数组,并传递
然后
一个返回承诺的方法。除非我错过了什么,唯一的区别就是承诺何时兑现?@ste2425:是的,这就是区别。但是OP说他想让他们按顺序执行……就目前情况而言,他可以使用
Promise.all(requestQueue)
@Bergi-ahh好的,我总是想问一下,万一我在努力学习的过程中错过了什么。我认为OP是串行的,这就是为什么我保留了reduce,但这会并行地执行它们,所以一切都很好。我的意思是串行的,第一个promise解析,然后开始第二个promise。Promise.all将异步运行它们。如果不明确,我会道歉。P1执行并解析,P2启动,依此类推。
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]);