Promise 在处理异步的时候是个很好的选择,可以减少嵌套层次,让代码更好读,逻辑更清晰。ES6 将其加入规范,jQuery 3.0 也修改实现向规范靠拢(3.0 发布公告)。一些新增元素比如 .fetch() 原生就 “thenable”,不过大多数以往的 API 还要依赖回调,这个时候,我们只要将它们重新封装,就能避开嵌套陷阱,享受 Promise 带来的愉悦体验。 Promise 一般用法 先来看下 Promise 的一般用法。 // 声明 Promise 对象 var p = new Promise(function (resolve, reject) { // 不管啥时候,该执 【JavaScript中的Promise与FileReader封装】 Promise是JavaScript中处理异步操作的重要工具,它使得复杂的异步流程控制变得更加简洁和易读。在ES6中,Promise被正式纳入规范,而jQuery 3.0也对其实现进行了更新,以遵循Promise的规范。Promise的基本用法涉及构造函数,它接收一个函数,该函数接受两个参数:`resolve`和`reject`。当异步操作成功时,调用`resolve`传递结果;当操作失败时,调用`reject`传递错误。 ```javascript var p = new Promise(function(resolve, reject) { setTimeout(function() { resolve(1); }, 5000); }); p.then(function(num) { console.log(num); // 1 }, function(num) { console.log(num); // 2 }); ``` 在上述例子中,Promise实例创建后,当`setTimeout`执行完,`resolve`被调用,触发`.then`的第一个回调函数。如果在`setTimeout`内部发生错误,`reject`会被调用,触发`.then`的第二个回调函数(或`.catch`)。 为了封装FileReader,我们可以利用它的`onload`和`onerror`事件。FileReader提供了读取文件的方法,如`readAsText`和`readAsDataURL`。当读取成功,`onload`事件触发,我们可以在此调用`resolve`,将FileReader对象传递给下一个处理阶段;当读取失败,`onerror`事件触发,调用`reject`并传递错误信息。 ```javascript 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); } }); } ``` 使用封装好的`reader`函数,我们可以轻松地处理文件读取,并通过`.then`和`.catch`处理结果或错误: ```javascript reader(file) .then(function(reader) { console.log(reader.result); }) .catch(function(error) { console.log(error); }); ``` Promise的好处在于,它可以链式调用,允许我们在异步操作完成后执行更多的任务。例如,我们可以添加更多的`.then`来处理读取后的数据,或者使用`.catch`捕获可能出现的错误。这样的设计使得异步代码更加模块化,易于理解和维护。 通过Promise封装FileReader,我们可以避免回调地狱,提高代码的可读性和可维护性。当需要对多个文件进行操作时,Promise的链式调用特性尤为有用,因为每个操作都可以作为一个独立的阶段,简化了复杂流程的管理。同时,返回的Promise对象可以被任意传递,使得异步操作的组织更加灵活。
- 粉丝: 10
- 资源: 888
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助