javascript - 循环中的所有异步调用完成后如何调用函数?

标签 javascript reactjs

reader.onloadend 调用异步函数 addData 并且 reader.onloadend 处于循环中。

const uploadFiles = () => {
    console.log(acceptedFiles)
    setLoading(true)
    console.log(loading)
    let i = 0
    let l = acceptedFiles.length

    for (i = 0; i < l; i++) {
      let file = acceptedFiles[i]
      const reader = new window.FileReader()
      reader.readAsArrayBuffer(file)
      reader.onloadend = () => {
        let buffer = Buffer(reader.result)
        console.log(buffer)
        addData(file.path, buffer)
      }
    }
  }
这是我的异步函数 addData
async function addData(name, buffer) {
    const file = await myfunction()
    
  }
在调用循环中的所有异步 addData 之后,我想调用 setLoading(false) 。
onClick 功能不起作用,当我在所有异步功能完成之前单击按钮时,加载设置为 false。
const [loading, setLoading] = useState(false)
<button onClick={() => {
                uploadFiles()
                 setLoading(false) 
             }}
            disabled={loading}
          >

最佳答案

使用 Promise,您可以知道何时读取了所有文件。基本思路如下

const uploadFiles = (evt) => {

  // set loading to true;

  const acceptedFiles = [...evt.target.files];

  // Create a map of promises that will resolve when file is read
  const readerPromises = acceptedFiles.map(file => {
    return new Promise(resolve => {
      const reader = new window.FileReader()
      reader.readAsArrayBuffer(file)
      reader.onloadend = () => {
        console.log(file);
        let buffer = reader; // Buffer(reader.result)
        resolve([file.name, buffer])
      }      
    });
  });

  // Detects when all of the promises are fully loaded
  Promise.all(readerPromises).then(results => {
    console.log(results);
    // set loading to false;
  });
  
};
<input type="file" multiple onchange="uploadFiles(event)" />

关于javascript - 循环中的所有异步调用完成后如何调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66014882/

相关文章:

javascript - 在 CMS 中加载时启动 JavaScript 函数的正确方法是什么?

javascript - React.js - 用简单的英语来说什么是 mapDispatchToProps?

javascript - 如何将 React 应用程序的生产 npm 版本部署到 Azure 应用服务

node.js - Node js - http2 的 bundler

javascript - react : input slider trying to limit value of second slider to above first slider

javascript - 在 Hapi.js 中,我可以重定向到不同的端点并设置状态码吗?

javascript - 使用JSP/Servlet/Ajax下载文件而不刷新页面

javascript - 使用 onclick 切换 2 个 slider

javascript - 登录检索器上的 Sequelize 查找总是成功

reactjs - React hooks - 当我们刷新页面时从 react-router 位置状态中删除