在Axios中链接数组的承诺

时间:2016-08-03 07:43:25

标签: 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.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
    }
  });
};

响应只是第一个解决的问题。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

这是您使用数组同步链接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]);

答案 1 :(得分:0)

我的理解是<script type="text/javascript"> alert("iooooooooooooo"); $(document).ready(function(){ $("#chartid").click(function() { alert("i"); $.ajax({ type: "POST", url: "WebForm1.aspx/summarydata", contentType: "application/json; charset=utf-8", dataType: "json", async: true, cache: false, success: function (result) { alert(result.d); alert("i"); }, error: function (error) { alert(error); } }); }); }); </script> 需要执行一个函数。它的行为将根据该函数的返回值而改变(如果它的.then())。

因此,您需要更改缩减以向thenable提供将返回.then的方法:

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