javascript异步下载 Promise实现

一般下载都是直接打开一个链接就行。
var URL = ‘XXXX‘;
window.open(URL)
其实这样会有些问题:
1. 浏览器禁止打开新窗口,导致无法下载

那么怎么解决呢?
这样:

1 <a href="http://somehost/somefile.zip" download="filename.zip">Download file</a>

注意download属性,它说明要下载,并且文件名:filename.zip

那么如何异步下载?
JS的代码:

 1 var myDownload = function(){};
 2 myDownload.prototype = {
 3      // 同步 下载,只是将上面的例子变为js罢了
 4     download: function( url, filename ){
 5         var a = document.createElement(‘a‘);
 6         a.href = url;
 7         a.download = filename;
 8         a.click();
 9     },
10
11     // 根据blob对象来下载
12     downloadByBlob: function(blod,name){
13         console.log(‘blod‘,blod);
14         name = name || blod.name;
15         var fileURL = window.URL.createObjectURL(blod); // 转换为可访问的URL
16         this.download(fileURL, name); // 下载
17         window.URL.revokeObjectURL(fileURL); //下载后释放URL
18     },
19
20     // 异步 data=‘name=mynam&age=20‘
21     ajax:function(url,data,method,type,successFuc,errorFuc){
22         method = method || ‘GET‘;
23         data = data || ‘‘;
24         type = type || ‘blob‘;
25         var request = new XMLHttpRequest();
26         if (window.XMLHttpRequest){
27             request=new XMLHttpRequest();
28         }
29         else if (window.ActiveXObject){
30             request=new ActiveXObject("Microsoft.XMLHTTP");
31         }else{
32             return false;
33         }
34         request.open(method, url);
35         request.responseType = type;
36         // When the request loads, check whether it was successful
37         request.onload = function() {
38             if (request.status === 200) {
39                 if(successFuc){
40                     var filename = request.getResponseHeader(‘Content-Disposition‘);
41                     if(filename){
42                         var index = filename.indexOf(‘filename=‘);
43                         if(index!==-1){
44                             filename = filename.substring(index+9);
45                         }
46                     }
47                     successFuc(request.response,filename)
48                 }
49             } else {
50                 if(successFuc){
51                     successFuc(request.response)
52                 }
53             }
54         }
55         request.onerror = function(error) {
56         // Also deal with the case when the entire request fails to begin with
57         // This is probably a network error, so reject the promise with an appropriate message
58             if(errorFuc){
59                 errorFuc(error.response)
60             }
61         };
62         // Send the request
63         request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
64         request.send(data);
65     },
66
67     // 异步下载 没有Promise
68     downloadAsync:function(url,name,data,method){
69         var self = this;
70         this.ajax(url,data,method,‘blob‘,function(blob,filename){
71             self.downloadByBlob(blob,name||filename);
72         });
73     },
74
75     // 异步下载 使用Promise
76     downloadPromise:function(url,name,data,method){
77         if(window.Promise){
78             var self = this;
79             return new Promise(function(resolve, reject) {
80                 console.log(this,‘this‘);
81                 self.ajax(url,data,method,‘blob‘,function(response,filename){
82                     resolve({
83                         data:response,
84                         filename:filename
85                     });
86                 },function(response,filename){
87                     reject({
88                         data:response,
89                         filename:filename
90                     });
91                 })
92             }).then(function(json){
93                 self.downloadByBlob(json.data,json.filename);
94             });;
95         }else{
96            self.downloadAsync(url,data,method);
97         }
98     }
99 }

PHP的代码:

1 ini_set(‘memory_limit‘, ‘64M‘);
2 $file="myLittleVader.jpg";
3 header(‘Content-Type:application/octet-stream‘);
4 header(‘Content-Disposition:attachment; filename=‘.$file); //设定文件名
5 header(‘Content-Length:‘.filesize($file));
6 readfile($file);

HTML:

 1 <!DOCTYPE html>
 2 <html>
 3   <head>
 4     <meta charset="utf-8">
 5     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 6     <meta name="viewport" content="width=device-width">
 7
 8     <title>异步下载 example</title>
 9   </head>
10
11   <body>
12     <h1>异步下载 example</h1>
13     <a href="#" onclick=‘DownJs.downloadPromise("download.php")‘>DownloadJs</a>
14   </body>
15
16 <script type="text/javascript" src="./download.js"></script>
17   <script>
18   var DownJs = new myDownload();
19   </script>
20 </html>

一般使用download既可以了,可以直接:

1 DownJs.download(url)

参考:
https://segmentfault.com/a/1190000005863250
promise下载

时间: 2024-10-13 11:50:53

javascript异步下载 Promise实现的相关文章

JavaScript异步编程设计快速响应的网络应用

JavaScript已然成为了多媒体.多任务.多内核网络世界中的一种单线程语言.其利用事件模型处理异步触发任务的行为成就了JavaScript作为开发语言的利器.如何深入理解和掌握JavaScript异步编程变得尤为重要!!!<JavaScript异步编程设计快速响应的网络应用>提供了一些方法和灵感. 一.深入理解JavaScript事件 1. 事件的调度 JavaScript事件处理器在线程空闲之前不会运行(空闲时运行). var start = new Date(); setTimeout

探索Javascript 异步编程

在我们日常编码中,需要异步的场景很多,比如读取文件内容.获取远程数据.发送数据到服务端等.因为浏览器环境里Javascript是单线程的,所以异步编程在前端领域尤为重要. 异步的概念 所谓异步,是指当一个过程调用发出后,调用者不能立刻得到结果.实际处理这个调用的过程在完成后,通过状态.通知或者回调来通知调用者. 比如我们写这篇文字时点击发布按钮,我们并不能马上得到文章发布成功或者失败.等待服务器处理,这段时间我们可以做其他的事情,当服务器处理完成后,通知我们是否发布成功. 所谓同步,是指当一个过

JavaScript异步编程(2)- 先驱者:jsDeferred

原文出处: linkFly   欢迎分享原创到伯乐头条 JavaScript当前有众多实现异步编程的方式,最为耀眼的就是ECMAScript 6规范中的Promise对象,它来自于CommonJS小组的努力:Promise/A+规范. 研究javascript的异步编程,jsDeferred也是有必要探索的:因为Promise/A+规范的制定基本上是奠定在jsDeferred上,它是javascript异步编程中里程碑式的作品.jsDeferred自身的实现也是非常有意思的. 本文将探讨项目js

JavaScript异步编程 ( 一 )

1. 异步编程 Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推.这种模式的好处是实现起来比较简单,执行环境相对单纯:坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他

Javascript 异步加载详解(转)

本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy execution),async 属性, defer 属性 一.同步加载与异步加载的形式 1. 同步加载 我们平时最常使用的就是这种同步加载形式: <script src="http://yourdomain.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续

获取JavaScript异步函数的返回值

今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值? 1.错误尝试 当年未入行时,我的最初尝试: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script> function getSomething() {  var r = 0;  setTimeout(function() {  r = 2;  }, 10);  return r; } function compute() {  var x = getSomething();  alert

深入解析Javascript异步编程

这里深入探讨下Javascript的异步编程技术.(P.S. 本文较长,请准备好瓜子可乐 :D) 一. Javascript异步编程简介 至少在语言级别上,Javascript是单线程的,因此异步编程对其尤为重要. 拿nodejs来说,外壳是一层js语言,这是用户操作的层面,在这个层次上它是单线程运行的,也就是说我们不能像Java.Python这类语言在语言级别使用多线程能力.取而代之的是,nodejs编程中大量使用了异步编程技术,这是为了高效使用硬件,同时也可以不造成同步阻塞.不过nodejs

简单实现异步编程promise模式

本篇文章主要介绍了异步编程promise模式的简单实现,并对每一步进行了分析,需要的朋友可以参考下 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多或少用到,最典型的就是异步ajax,发送异步请求,绑定回调函数,请求响应之后调用指定的 回调函数,没有阻塞其他代码的执行.还有像setTimeout方法同样也是异步执行回调的方法. 如果对异步编程还不太熟悉的话,直接戳 阮一峰大牛的教程 ,这篇文章介绍了四种异步编程的方式: 回调函数 事件监听 发布

JavaScript 异步开发全攻略(转)

写了一本介绍 JavaScript 异步开发的小书: https://meathill.gitbooks.io/javascript-async-tutorial/content/ 除了比较详细的介绍了异步开发面临的问题,Promise 和异步函数的使用,还结合实际开发中遇到的一些场景进行了分析,给出了范例代码,比如小程序.Vue 等.水平有限,大家如果发现问题,也请不吝赐教. 因为种种原因开启的这个话题,我希望能够把它尽量做完整,所以会保持随时更新,尽量涵盖最近遇到的问题. 希望对大家有所帮助