javaScript callback()回调函数、blob()

209 阅读2分钟
  1. callback() A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. 概念: 是一个函数,作为另外一个函数的参数,在它的父函数完成后被执行。

    如果当有很多地方需要调用同一个函数,并且这一函数根据不同的需要,作不同的处理,这个时候用回调函数。可以减少代码的冗余。

function A(callback){
    callback()
    console.log('我是主函数')
  }
function B(){
   console.log('我是回调函数')
  }
    
  A(B)
  
  // 输出结果为: 
    我是主函数
    我是回调函数
从以上代码可以看出,我们先执行的回调函数callback(),但是输出的时候却是后输出回调函数里面的内容,由此可以证实上面的说法,要等到主函数里面的事情干完再回头去执行回调函数。

开发中的使用----文件的下载

<script>
    downloadFile(item){
        this.getBlob(item.fileUrl, (blob)=> {
            this.saveAs(blob, item.fileName)
        })
    }
    
    getBlob(url, cb){
        let xhr = new XMLHttpRequest()
        xhr.open('GET', url, true)
        xhr.responseType = 'blob'
        xhr.onload = function(){
            if(xhr.status === 200){
                return cb(xhr.response)
            }   
        }
        xhr.send()
    }
    
    saveAs(blob, filename){
        if(window.navigator.msSaveOrOpenBlob){
            navigator.msSaveBlob(blob, filename);
        } else {
            // 创建隐藏的可下载链接
            let link = document.creantElement('a')
            let body = document.querySelector('body')
            // 将自负内容转为blob地址(映射为blob地址)
            link.href = window.URL.createObjectURL(blob)
            link.download = filename
            link.style.display = 'none'
            body.appendChild(link)
            // 移除
            window.URL.revokeObjectURL(link.href)
        }
    }

</script>

点击按钮进行下载,先获取文件的blob,再进行下载。 浏览器内部为每个通过 URL.createObjectURL 生成的 URL 存储了一个 URL → Blob 映射

虽然存储了 URL → Blob 的映射,但 Blob 本身仍驻留在内存中,浏览器无法释放它。映射在文档卸载时自动清除,因此 Blob 对象随后被释放。但是,如果应用程序寿命很长,那不会很快发生。因此,如果我们创建一个 Blob URL,即使不再需要该 Blob,它也会存在内存中。

URL.revokeObjectURL(url) 方法,从内部映射中删除引用,从而允许删除 Blob(如果没有其他引用)

href和download是我们下载文件所需要的两个属性:

  • href:是指这个超链接指向的url地址;
  • download:该属性是HTML5新增的属性,此属性是让我们的浏览器下载URL而不是跳转到URL所指向的内容,所以若我们需要下载文件到本地,需要设置这个属性值。

了解更多内容 developer.mozilla.org/zh-CN/docs/…