在ReactJS中发出多个并行axios请求

我需要制作一个导入记录的进度条,该记录是用户从前端发送到服务器的(在春季启动时)。

第一个请求将导入数据库(后请求)。我用来了解插入进度的第二个请求。因此,有时我需要发送有关导入进度的第二个请求,但是我失败了。

问题是,在启动第一个请求之后,什么也没发生(我在服务器上的输出中看到了这一点,即已导入行,就是这样),整个接口都冻结了

当第一个请求在浏览器中发送并且第二个请求的答案返回给我时,我试图在失眠中发送第二个请求。当我在浏览器中同时发出两个请求时,没有响应。

代码(反应):

async sendRecordsToServer() {
    let stateSaved = this;
    const response = await axios({
        method: 'post',
        url: /*url*/,
        data: JSON.stringify(this.state.selectedData),
        headers: /*headers*/
    });
    const json = await response.data;
    if (json) {
        console.log("response from server 1 request if");
        console.log(json);
        stateSaved.setState({
            countOfImportedRows: json.length
        });
        stateSaved.setState({  
            modalStateShowInfoImport: "show"
        });  
        return true;
    } else {
        console.log("response from server 1 request else");
        console.log(json);
        stateSaved.setState({  
            modalStateShowActiveSession: "show"
        }); 
        return false;  
    }
}

async getLastIdInTable() {
    let stateSaved = this;
    const response = await axios({
        method: 'get',
        url: /*url*/,
        headers: /*headers*/
    });
    const json = await response.data;
    console.log("response from server 2 request");
    console.log(json);
    return json;
}

sleep(time) {
    return new Promise((resolve) => setTimeout(resolve, time));
}

async _sendData(){
    const lastIdInTableBeforeImport = await this.getLastIdInTable();
    let countOfAlreadyImportedRows = 0;
    const responseFromImporting = await this.sendRecordsToServer();

    while (countOfAlreadyImportedRows != this.state.data.length) {
        this.sleep(3000).then(async () => {
            const lastIdInTableCurrent = await this.getLastIdInTable();
            countOfAlreadyImportedRows = lastIdInTableCurrent - lastIdInTableBeforeImport;
            console.log("in loop");
            console.log(countOfAlreadyImportedRows);
        }); 
    }
}

UPD:

对代码进行一些更改并添加新内容console.log()以显示更多详细信息

码:

async _sendData(){
    const lastIdInTableBeforeImport = await this.getLastIdInTable();
    let countOfAlreadyImportedRows = 0;
    const responseFromImporting = this.sendRecordsToServer();
    console.log("after sendRecordsToServer()");
    while (countOfAlreadyImportedRows != this.state.data.length) {
        console.log("before sleep");
        this.sleep(3000).then(async () => {
            console.log("in sleep");
            const lastIdInTableCurrent = await this.getLastIdInTable();
            countOfAlreadyImportedRows = lastIdInTableCurrent - lastIdInTableBeforeImport;
            console.log("in loop");
            console.log(countOfAlreadyImportedRows);
        }); 
    }
}

async sendRecordsToServer() {
    let stateSaved = this;
    const response = await axios({
        method: 'post',
        url: /*url*/,
        data: JSON.stringify(this.state.selectedData),
        headers: /*headers*/
    });
    // const json = await response.data;
    // if (json) {
    //     console.log("response from server 1 request if");
    //     console.log(json);
    //     stateSaved.setState({
    //         countOfImportedRows: json.length
    //     });
    //     stateSaved.setState({  
    //         modalStateShowInfoImport: "show"
    //     });  
    //     return true;
    // } else {
    //     console.log("response from server 1 request else");
    //     console.log(json);
    //     stateSaved.setState({  
    //         modalStateShowActiveSession: "show"
    //     }); 
    //     return false;  
    // }
}

async getLastIdInTable() {
    let stateSaved = this;
    const response = await axios({
        method: 'get',
        url: /*url*/,
        headers: /*headers*/
    });
    const json = await response.data;
    console.log("response from server 2 request");
    console.log(json);
    return json;
}

sleep(time) {
    return new Promise((resolve) => setTimeout(resolve, time));
}
六月温斯顿

尝试这个:

async _sendData(){ 
   const lastIdInTableBeforeImport = await this.getLastIdInTable();
    let countOfAlreadyImportedRows = 0;
    const responseFromImporting = await this.sendRecordsToServer(); // let's add `await` back, it isn't the murder.
    console.log("after sendRecordsToServer()");

    const timerId = setInterval(()=> {
    if(countOfAlreadyImportedRows !== this.state.data.length) {

       this.getLastIdInTable().then((lastIdInTableCurrent) => {
         countOfAlreadyImportedRows = lastIdInTableCurrent - 
         lastIdInTableBeforeImport;
         console.log("in loop");
         console.log(countOfAlreadyImportedRows);
       })

   }else{
    clearInterval(timerId);
   }

  }, 3000);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

并行发出多个 http 请求

在 React Native 中发出多个 axios 请求以获取不同的数据并输入到屏幕的多个部分

我无法在AXIOS中发出GET请求?

在节点js中发出多个请求

如何通过axios在Reactjs中使用多个参数发出post请求

Vuejs和Axios发出多个获取请求

如何使用 axios 在 JavaScript 中发出同步 HTTP GET 请求?

如何在 RxJs 中发出多个嵌套的 http 请求?

如何在 Firebase 函数中发出多个 fetch 请求?

如何使用 Rails 和 Heroku 发出多个并行并发请求

reactjs使用axios发出https(不是http)请求

Axios在vuex操作中发布具有多个参数的请求

如何避免在axios中发送多个重复的AJAX请求

发出多个 Axios 请求导致 CORS 错误

并行运行多个Axios请求以验证数据

从 Springboot + Webflux 发出并行请求

ReactJS Fetch 调用一次但多个请求发出

在 reactjs 中发出 POST 请求时,数据未插入到有效负载中

如何使用多个自定义标头在 k6 中发出简单的 POST 请求

服务多个静态文件并在golang中发出发布请求

如何基于第一个响应在RxJS中发出多个Ajax请求

在一个http调用中发出多个请求-Google Apps脚本.fetch

使用axios发出Curl请求

并行发出多个请求时,HttpClient会花费大量时间(除非Http版本设置为1.0)

如何在puppeteer中发出POST请求?

尝试在 TextWatcher 中发出 HTTP 请求

在setState()的回调中发出AJAX请求

在不同线程中发出Volley请求

如何在Rust中发出GET请求?