ImageVerifierCode 换一换
格式:DOC , 页数:7 ,大小:36.50KB ,
资源ID:9761250      下载积分:6 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/9761250.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(JavaScript-Promise启示录.doc)为本站上传会员【人****来】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

JavaScript-Promise启示录.doc

1、   本篇,主要普及promise的用法。   一直以来,JavaScript处理异步都是以callback的方式,在前端开发领域callback机制几乎深入人心。在设计API的时候,不管是浏览器厂商还是SDK开发商亦或是各种类库的作者,基本上都已经遵循着callback的套路。   近几年随着JavaScript开发模式的逐渐成熟,CommonJS规范顺势而生,其中就包括提出了Promise规范,Promise完全改变了js异步编程的写法,让异步编程变得十分的易于理解。   在callback的模型里边,我们假设需要执行一个异步队列,代码看起来可能像这样:   view sou

2、rceprint?1 loadImg('a.jpg', function() {   2 loadImg('b.jpg', function() {   3 loadImg('c.jpg', function() {   4 console.log('all done!');   5 });   6 });   7 });   这也就是我们常说的回调金字塔,当异步的任务很多的时候,维护大量的callback将是一场灾难。当今Node.js大热,好像很多团队都要用它来做点东西以沾沾“洋气”,曾经跟一个运维的同学聊天,他们也是打算使用Node.js做一些事情,可是一想到

3、js的层层回调就望而却步。   好,扯淡完毕,下面进入正题。   Promise可能大家都不陌生,因为Promise规范已经出来好一段时间了,同时Promise也已经纳入了ES6,而且高版本的chrome、firefox浏览器都已经原生实现了Promise,只不过和现如今流行的类Promise类库相比少些API。   所谓Promise,字面上可以理解为“承诺”,就是说A调用B,B返回一个“承诺”给A,然后A就可以在写计划的时候这么写:当B返回结果给我的时候,A执行方案S1,反之如果B因为什么原因没有给到A想要的结果,那么A执行应急方案S2,这样一来,所有的潜在风险都在A的可控范围之内了

4、   上面这句话,翻译成代码类似:   view sourceprint?1 var resB = B();   2 var runA = function() {   3 resB.then(execS1, execS2);   4 };   5 runA();   只看上面这行代码,好像看不出什么特别之处。但现实情况可能比这个复杂许多,A要完成一件事,可能要依赖不止B一个人的响应,可能需要同时向多个人询问,当收到所有的应答之后再执行下一步的方案。最终翻译成代码可能像这样:   view sourceprint?01 var resB = B();   02

5、var resC = C();   03 ...   04   05 var runA = function() {   06 reqB   07 .then(resC, execS2)   08 .then(resD, execS3)   09 .then(resE, execS4)   10 ...   11 .then(execS1);   12 };   13   14 runA();   在这里,当每一个被询问者做出不符合预期的应答时都用了不同的处理机制。事实上,Promise规范没有要求这样做,你甚至可以不做任何的处理(即不传

6、入then的第二个参数)或者统一处理。   好了,下面我们来认识下Promise/A+规范:   一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)   一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换   promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致   then方法接受两个参数,

7、第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。   可以看到,Promise规范的内容并不算多,大家可以试着自己实现以下Promise。   以下是笔者自己在参考许多类Promise库之后简单实现的一个Promise,代码请移步promiseA。   简单分析下思路:   构造函数Promise接受一个函数resolver,可以理解为传入一个异步任务,resolver接受

8、两个参数,一个是成功时的回调,一个是失败时的回调,这两参数和通过then传入的参数是对等的。   其次是then的实现,由于Promise要求then必须返回一个promise,所以在then调用的时候会新生成一个promise,挂在当前promise的_next上,同一个promise多次调用都只会返回之前生成的_next。   由于then方法接受的两个参数都是可选的,而且类型也没限制,可以是函数,也可以是一个具体的值,还可以是另一个promise。下面是then的具体实现:   view sourceprint?01 Promise.prototype.then = functio

9、n(resolve, reject) {   02 var next = this._next || (this._next = Promise());   03 var status = this.status;   04 var x;   05   06 if('pending' === status) {   07 isFn(resolve) && this._resolves.push(resolve);   08 isFn(reject) && this._rejects.push(reject);   09 retur

10、n next;   10 }   11   12 if('resolved' === status) {   13 if(!isFn(resolve)) {   14 next.resolve(resolve);   15 } else {   16 try {   17 x = resolve(this.value);   18 resolveX(next, x);   19 } catch(e) {   20 this.reject(e);   21 }   22 }   23 return next;   24 }   25

11、   26 if('rejected' === status) {   27 if(!isFn(reject)) {   28 next.reject(reject);   29 } else {   30 try {   31 x = reject(this.reason);   32 resolveX(next, x);   33 } catch(e) {   34 this.reject(e);   35 }   36 }   37 return next;   38 }   39 };   这里,then做了简化,其他prom

12、ise类库的实现比这个要复杂得多,同时功能也更多,比如还有第三个参数——notify,表示promise当前的进度,这在设计文件上传等时很有用。对then的各种参数的处理是最复杂的部分,有兴趣的同学可以参看其他类Promise库的实现。   在then的基础上,应该还需要至少两个方法,分别是完成promise的状态从pending到resolved或rejected的转换,同时执行相应的回调队列,即resolve()和reject()方法。   到此,一个简单的promise就设计完成了,下面简单实现下两个promise化的函数:   view sourceprint?01 functi

13、on sleep(ms) {   02 return function(v) {   03 var p = Promise();   04   05 setTimeout(function() {   06 p.resolve(v);   07 }, ms);   08   09 return p;   10 };   11 };   12   13 function getImg(url) {   14 var p = Promise();   15 var img = new Image();   16   17 img.on

14、load = function() {   18 p.resolve(this);   19 };   20   21 img.onerror = function(err) {   22 p.reject(err);   23 };   24   25 img.url = url;   26   27 return p;   28 };   由于Promise构造函数接受一个异步任务作为参数,所以getImg还可以这样调用:   view sourceprint?01 function getImg(url) {   02 return

15、Promise(function(resolve, reject) {   03 var img = new Image();   04   05 img.onload = function() {   06 resolve(this);   07 };   08   09 img.onerror = function(err) {   10 reject(err);   11 };   12   13 img.url = url;   14 });   15 };   接下来(见证奇迹的时刻),假设有一个BT的需求要这么实现:异步获取一

16、个json配置,解析json数据拿到里边的图片,然后按顺序队列加载图片,没张图片加载时给个loading效果   view sourceprint?01 function addImg(img) {   02 $('#list').find('> li:last-child').html('').append(img);   03 };   04   05 function prepend() {   06 $('<li>')   07 .html('loading...')   08 .appendTo($('#list'));   09

17、};   10   11 function run() {   12 $('#done').hide();   13 getData('map.json')   14 .then(function(data) {   15 $('h4').html(data.name);   16   17 return data.list.reduce(function(promise, item) {   18 return promise   19 .then(prepend)   20 .then(sleep(1000))   21 .then(func

18、tion() {   22 return getImg(item.url);   23 })   24 .then(addImg);   25 }, Promise.resolve());   26 })   27 .then(sleep(300))   28 .then(function() {   29 $('#done').show();   30 });   31 };   32   33 $('#run').on('click', run);   这里的sleep只是为了看效果加的,可猛击查看demo!当然,Node.js的例子可查

19、看这里。   在这里,Promise.resolve(v)静态方法只是简单返回一个以v为肯定结果的promise,v可不传入,也可以是一个函数或者是一个包含then方法的对象或函数(即thenable)。   类似的静态方法还有Promise.cast(promise),生成一个以promise为肯定结果的promise;   Promise.reject(reason),生成一个以reason为否定结果的promise。   我们实际的使用场景可能很复杂,往往需要多个异步的任务穿插执行,并行或者串行同在。这时候,可以对Promise进行各种扩展,比如实现Promise.all(),接

20、受promises队列并等待他们完成再继续,再比如Promise.any(),promises队列中有任何一个处于完成态时即触发下一步操作。   标准的Promise   可参考html5rocks的这篇文章JavaScript Promises,目前高级浏览器如chrome、firefox都已经内置了Promise对象,提供更多的操作接口,比如Promise.all(),支持传入一个promises数组,当所有promises都完成时执行then,还有就是更加友好强大的异常捕获,应对日常的异步编程,应该足够了。   第三方库的Promise   现今流行的各大js库,几乎都不同程度的

21、实现了Promise,如dojo,jQuery、Zepto、when.js、Q等,只是暴露出来的大都是Deferred对象,以jQuery(Zepto类似)为例,实现上面的getImg():   view sourceprint?01 function getImg(url) {   02 var def = $.Deferred();   03 var img = new Image();   04   05 img.onload = function() {   06 def.resolve(this);   07 };   08   09 img.one

22、rror = function(err) {   10 def.reject(err);   11 };   12   13 img.src = url;   14   15 return def.promise();   16 };   当然,jQuery中,很多的操作都返回的是Deferred或promise,如animate、ajax:   view sourceprint?01 // animate   02 $('.box')   03 .animate({'opacity': 0}, 1000)   04 .promise()   

23、05 .then(function() {   06 console.log('done');   07 });   08   09 // ajax   10 $.ajax(options).then(success, fail);   11 $.ajax(options).done(success).fail(fail);   12   13 // ajax queue   14 $.when($.ajax(options1), $.ajax(options2))   15 .then(function() {   16 console.log('

24、all done.');   17 }, function() {   18 console.error('There something wrong.');   19 });   jQuery还实现了done()和fail()方法,其实都是then方法的shortcut。   处理promises队列,jQuery实现的是$.when()方法,用法和Promise.all()类似。   其他类库,这里值得一提的是when.js,本身代码不多,完整实现Promise,同时支持browser和Node.js,而且提供更加丰富的API,是个不错的选择。这里限于篇幅,不再展开。

25、   尾声   我们看到,不管Promise实现怎么复杂,但是它的用法却很简单,组织的代码很清晰,从此不用再受callback的折磨了。   最后,Promise是如此的优雅!但Promise也只是解决了回调的深层嵌套的问题,真正简化JavaScript异步编程的还是Generator,在Node.js端,建议考虑Generator。   更多信息请查看IT技术专栏   

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服