javascript - 返回循环中的每个响应

标签 javascript axios

我有一个使用 axios 的函数,我根据为特定用户返回的 id 数量删除多条记录。

async function DeleteAllRecords (emailAddress) {
    try {
        var accessToken = await setup.getAccessToken(emailAddress);
        var userId = await user.getUserId(emailAddress);
        var recordIds = await getAllRecordID(emailAddress);
        console.log(`Deleting all records for `+emailAddress+``);
        for (const rId of recordIds) {
            const response = await axios.delete(`${process.env.API_URL}/`+userId+`/records/`+recordIds+``, {'headers': {Authorization: 'Bearer '+accessToken+''}});
        }
        return response;
    }
    catch(e) {
        console.error(``+emailAddress+` produced the Record Delete Error = ` + e);
    }
}

这不起作用,我不确定为什么。我想查看每个 axios.delete 调用的响应,但我不确定如何获得它。目前其返回的响应未定义。

最佳答案

为什么你的代码不起作用:

  1. const response在循环作用域内声明,并且不能在该闭包之外访问。
  2. 即使它是在循环之前定义的(使用 let const )并在循环内部分配,您仍然只能返回最后一个响应。

您可以将每个响应推送到一个数组 ( responses ),并返回该数组:

async function DeleteAllRecords (emailAddress) {
    try {
        var accessToken = await setup.getAccessToken(emailAddress);
        var userId = await user.getUserId(emailAddress);
        var recordIds = await getAllRecordID(emailAddress);
        console.log(`Deleting all records for `+emailAddress+``);
        const responses = [];
        for (const rId of recordIds) {
            const response = await axios.delete(`${process.env.API_URL}/`+userId+`/records/`+recordIds+``, {'headers': {Authorization: 'Bearer '+accessToken+''}});
            responses.push(response);
        }
        return responses;
    }
    catch(e) {
        console.error(``+emailAddress+` produced the Record Delete Error = ` + e);
    }
}

但是,在这种情况下,多个并行请求会更好,因为您实际上不需要一一删除。我会使用 Array.map()迭代 recordIds数组,并为每个数组返回一个 promise ,然后使用 Promise.all() 等待所有响应,它也会返回一组响应:

async function DeleteAllRecords (emailAddress) {
    try {
        var accessToken = await setup.getAccessToken(emailAddress);
        var userId = await user.getUserId(emailAddress);
        var recordIds = await getAllRecordID(emailAddress);
        console.log(`Deleting all records for `+emailAddress+``);
        
        return Promise.all(recordIds.map(rId =>  axios.delete(`${process.env.API_URL}/`+userId+`/records/`+recordIds+``, {'headers': {Authorization: 'Bearer '+accessToken+''}})));
    }
    catch(e) {
        console.error(``+emailAddress+` produced the Record Delete Error = ` + e);
    }
}

关于javascript - 返回循环中的每个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59380767/

相关文章:

ReactJS axios 拦截器如何调度注销操作

javascript - 从 Typescript 转译时 NodeJS 存在导入问题

javascript - JQuery 的 ajax 函数从 XML 中剥离 HTML 标签

javascript - 为什么我的 Controller 中的保存功能不起作用?

vue.js - 如何在nuxt中获取axios baseUrl?

javascript - javascript中的HTTP Content-Length header 计算

javascript - 修改console.log

javascript - node.js - 访问系统命令的退出代码和标准错误

javascript - axios在控制台上打印值但返回未定义

javascript - 从使用多个异步调用的函数返回