javascript下使用Promise封装FileReader


Posted in Javascript onFebruary 19, 2016

Promise 在处理异步的时候是个很好的选择,可以减少嵌套层次,让代码更好读,逻辑更清晰。ES6 将其加入规范,jQuery 3.0 也修改实现向规范靠拢(3.0 发布公告)。一些新增元素比如 .fetch() 原生就 “thenable”,不过大多数以往的 API 还要依赖回调,这个时候,我们只要将它们重新封装,就能避开嵌套陷阱,享受 Promise 带来的愉悦体验。

Promise 一般用法
先来看下 Promise 的一般用法。

// 声明 Promise 对象
var p = new Promise(function (resolve, reject) {
 // 不管啥时候,该执行then了,就调用 resolve
 setTimeout(function () { 
  resolve(1);
 }, 5000);

 // 或者不管啥问题,就调用 reject
 if (somethingWrong) {
  reject('2');
 }   
});
  
// 使用 Promise 对象
p.then(function (num) {
 // 对应上面的 resolve
 console.log(num); // 1
}, function (num) {
 // 对应上面的 reject
 console.log(num); // 2
});

Promise 的驱动模型并不复杂:任何操作,假定它只有两个结果,成功或者失败。那么只需要在合适的时间调用合适的程序,进入合适的后续步骤即可。.then() 顾名思义,就是下一步的意思,当前面的 Promise 有了结果——即调用 resolve 或者 reject——之后,就启动对应的处理函数。

Promise 实例创建后就会开始执行,判定结果需要我们自己来,比如加载成功,或者满足某个条件,等等。通过串联 .then() 则可以完成一系列操作。每次调用 .then() 都会创建一个新的 Promise 实例,它会静静等待前面的实例状态改变后再开始执行。

封装 FileReader
接下来开始封装。思路很简单,FileReader 除了提供各种 read 方法,还有几个事件钩子,其中 onerror 和 onload 很明显可以作为判断任务是否完成的依据。加载成功的话,就需要用到文件内容,所以将文件或文件内容传递到下一步也十分必要。

最后完成的代码如下:

function reader (file, options) {
 options = options || {};
 return new Promise(function (resolve, reject) {
  let reader = new FileReader();

  reader.onload = function () {
   resolve(reader);
  };
  reader.onerror = reject;

  if (options.accept && !new RegExp(options.accept).test(file.type)) {
   reject({
    code: 1,
    msg: 'wrong file type'
   });
  }

  if (!file.type || /^text\//i.test(file.type)) {
   reader.readAsText(file);
  } else {
   reader.readAsDataURL(file);
  }
 });
}

为了能真正派上用场,里面还有一些验证文件类型的操作,不过跟本文主旨无关,略过不表。这段代码的核心是创建一个 Promise 对象,等待 FileReader 读取完成后调用 resolve 方法,或者出现问题时调用 reject 方法。

使用刚才封装好的函数
接下来就可以在项目中使用了:

reader(file)
 .then(function (reader) {
  console.log(reader.result);
 })
 .catch(function (error) {
  console.log(error);
 });

.then() 支持两个参数,第一个在 Promise 成功时启动,第二个自然在失败时启动。用 .catch() 可以实现同样地效果。Promise 的好处除了可读性更佳以外,返回的 Promise 对象还可以任意传递,继续进行链式调用,有很大想象空间。

继续 .then()
于是我们不妨串联更多操作(本来想写个断点续传的,回头再说吧):

全选复制放进笔记reader(file)

.then(function (reader) {
  return new Promise(function (resolve, reject) {
   // 就随便暂停个5秒吧……
   setTimeout(function () {
    resolve(reader.result); 
   }, 5000);
  });
 })
 .then(function (content) {
  console.log(content);
 });

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
Jun 18 Javascript
滚动图片效果 jquery实现回旋滚动效果
Jan 08 Javascript
深入领悟JavaScript中的面向对象
Nov 18 Javascript
jQuery select表单提交省市区城市三级联动核心代码
Jun 09 Javascript
使用jQuery的attr方法来修改onclick值
Jul 07 Javascript
JavaScript汉诺塔问题解决方法
Apr 21 Javascript
js鼠标点击图片切换效果实现代码
Nov 19 Javascript
JQuery实现DIV其他动画效果的简单实例
Sep 18 Javascript
关于Vue.js一些问题和思考学习笔记(2)
Dec 02 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
Mar 08 Javascript
node错误处理与日志记录的实现
Dec 24 Javascript
Vue绑定用户接口实现代码示例
Nov 04 Javascript
javascript每日必学之循环
Feb 19 #Javascript
jQuery实现简单的DIV拖动效果
Feb 19 #Javascript
JavaScript深度复制(deep clone)的实现方法
Feb 19 #Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
Feb 19 #Javascript
基于JavaScript实现弹出框效果
Feb 19 #Javascript
jQuery on()绑定动态元素出现的问题小结
Feb 19 #Javascript
学习javascript文件加载优化
Feb 19 #Javascript
You might like
Laravel 读取 config 下的数据方法
2019/10/13 PHP
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
js调用css属性写法
2013/09/21 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
Python的高级Git库 Gittle
2014/09/22 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
Python编写打字训练小程序
2019/09/26 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
python+opencv实现车道线检测
2021/02/19 Python
大学生职业规划论文
2014/01/11 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
伏羲庙导游词
2015/02/09 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
新闻通讯稿范文
2015/07/22 职场文书
mysql 生成连续日期及变量赋值
2022/03/20 MySQL
Android自定义双向滑动控件
2022/04/19 Java/Android