美文网首页
关于解决JS遍历多个异步回调完美引用外部变量的几个办法

关于解决JS遍历多个异步回调完美引用外部变量的几个办法

作者: turmando | 来源:发表于2018-08-08 11:26 被阅读228次

最近项目里用到了多选图片二维码识别上传,由于二维码识别是异步回调,再次列举一下如何在循环回调引用变量

描述

由于JS里for循环是同步任务,而reader.onloadend是异步任务,所以同步的会先执行完循环结束,等到异步回调引用外部变量所以,始终是循环最后一次值,so,归纳了下面三种方式

Promise

Promise.all函数可以并行调用参数中的Promise对象方法,并且将所有Promise对象方法返回值作为数组输入到then回调中

fileReaderPromise = (file) =>{
   let promise = new Promise((resolve, reject) =>{
            let reader = new FileReader()
            reader.readAsDataURL(file)
            reader.onloadend = (e) => {
                let new_result = e.target.result
                resolve(new_result)
            }
   });
   return promise;
}

handle_images = (files) => {
    let filesPromise = files.map(file => this.fileReaderPromise(file))
    Promise.all(filesPromise)
        .then(data => {
            data.map((image,index) => console.log('image',image,'index',index))
        })
}

自执行函数

创建自执行函数局部作用域,保证外部变量不受影响

handle_images = (files) => {
    _.map(files, (file,index) => {
        (function(new_file,new_index){
            let reader = new FileReader()
            reader.readAsDataURL(file)
            reader.onloadend = (e) => {
                let new_result = e.target.result
                //...这里你可以引用new_file,new_index
                console.log('new_file',new_file,'new_index',new_index)
            }
         }.bind(this)(file,index)
    }
}

递归

handle_images = (i) => {
    let new_i = i
    if (new_i<files.length){
        let file = files[i]
        let reader = new FileReader()
        reader.readAsDataURL(file)
        reader.onloadend = (e) => {
            let new_result = e.target.result
            //...
            console.log('file',file,'i',i)
            
            //逻辑处理完后
            new_i++;
            this.handle_images(new_i)
        }
    }
}
//调用
this.handle_images(0)

相关文章

  • 关于解决JS遍历多个异步回调完美引用外部变量的几个办法

    最近项目里用到了多选图片二维码识别上传,由于二维码识别是异步回调,再次列举一下如何在循环回调引用变量 描述 由于J...

  • promise任务队列串行化执行

    js经常会遇到异步的执行,简单的异步执行可以使用回调,多个异步回调执行可以使用await/async解决。遇到多个...

  • 从回调函数到 async await,理清异步编程解决方案

    异步解决方案历程 1. 回调函数 回调函数是最开始的异步解决方案,在异步代码执行完后去执行回调函数 这样做有几个缺...

  • Vue引入js变量,常量及文件

    1,变量引用外部js: vue实例文件 2,方法调用外部js: vue实例文件 3,变量引用外部js: vue实例文件

  • Promise

    普通的回调函数解决异步问题,如果多个异步就会产生回调地域的问题,commonjs社区首先提出了promise规范,...

  • ES7之Async/await的使用详解

    在 js 异步请求数据时,通常,我们多采用回调函数的方式解决,但是,如果有多个回调函数嵌套时,代码显得很不优雅,维...

  • 你不知道的JS(中卷)第七章

    第七章 回调 回调是js异步的基本单元。随着js越来越成熟,对于异步编程的发展,回调已经不够用了。回调表达异步流的...

  • node.js(六)

    Node.js 回调函数Node.js 异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后...

  • 2020-02-23

    Node.js回调函数 Node.js异步编程的直接体现就是回调 异步编程依托于回调来实现,但不能说使用了回调后程...

  • js中的异步操作

    Node.js 中读取文件 回调函数嵌套造成回调地狱 Promise Promise 是异步编程的一种解决方案,比...

网友评论

      本文标题:关于解决JS遍历多个异步回调完美引用外部变量的几个办法

      本文链接:https://www.haomeiwen.com/subject/tzmtbftx.html