使用 React Js 将数据发送到多个 API 的最佳方式

Best way to send data into multiple API using React Js

现在我有以下信息(用户数据)要保存。我必须将它发送给两个 API (URL)。像这样。

http://api_url/users
http://api_url/user-card

现在我需要将数据发送到几个API (URL) 以保存用户和用户的卡信息。 我有以下数据:

const [data] = useState({
    last_name: "",
    first_name: "",
    middle_name: "",
    card_number: "",
    card_given_date: "",
});

像这样 post 使用 axios 请求。

 api.post("/users", params)
        .then(res => {
            let response = res.data;
            console.log("Saved");
            setLoadingBtn(false);
            window.location = "/user/card/" + response.id;
        })
        .catch(e => {
            console.log(e.toString());
            setLoadingBtn(false);
        })

一个 API 可以正常工作。我需要将名字、姓氏和中间名发送到 /users,并将 user_id、card_number 和 card_given_date 发送到第二个 api。我可以使用哪些变体同时向多个 API 发送 POST 请求? 谢谢!

已更新!这是另一个逻辑。 axios.all() 和 promises.all() 是获取请求的好方法。但是如果我们使用它们。假设 table 中的某个字段为空或填充了错误。在这种情况下,错误仅转移到一个 table 并保存另一个。这会导致逻辑错误。 像这样:

 const addUserInfo = api.postItem("users", params);
        const addCardInfo = api.postItem("user-card", params2);
        Promise.all([addUserInfo, addCardInfo])
            .then(res => {
                let response = res.data;
                console.log("Saved");
                setLoadingBtn(false);
                window.location = "/user/card/" + response.id;
            })
            .catch(e => {
                console.log(e);
                console.log(e.toString());
                setLoadingBtn(false);
            });

这样会导致逻辑混乱

使用javascript获取API或axios.post()方法将return一个承诺。

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

Promise.all([promise1, promise2, promise3])

示例...

let URL1 = "http://api_url/users"
let URL2 = "http://api_url/users-card"

const promise1 = axios.post(URL1, params1);
const promise2 = axios.post(URL2, params2);

Promise.all([promise1, promise2]).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"]

Promise.all 仅当数组中的所有承诺都已解决时才会继续。
如果数组 fails/reject 中有任何承诺,那么 Promise.all 也将被拒绝。

更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

复制自:

使用 redux-saga 或使用 promises 或字面上任何其他方法会更有意义,但这也可以工作:

function makeRequest(url, params, cb){
  api.post(url, params)
        .then(res => {
             //whatever you do
             cb()
        })
        .catch(e => {
            //however you behave
             cb()
        })
}

并这样称呼它:

makeRequest("/users", params, ()=>{
    makeRequest("/user-card",params)
})

你可以把事情搞得更乱一点:

function call(urlArr=['/users','/user-cards'],params){
    makeRequest(urlArr[this.state.counter],params,()=>{
        this.setState((prevState)=>({
            counter : prevState.counter+1
        }),()=>{
            if(this.state.counter<urlArr.length){
                call(['/users','/user-cards'], params)
            }
        )
    })
}

根据您的编辑和评论,您需要在第一个 api 成功时调用第二个 api,如下所示:

api.post("/users", params)
    .then(res => {
       let response = res.data;
       api.post("/users-card", params).then(res => {
           console.log("Saved");
           setLoadingBtn(false);
           window.location = "/user/card/" + response.id;
       });
   }).catch(e => {
        console.log(e.toString());
        setLoadingBtn(false);
    })