使用Promise模式来简化&#106avascript的异步回调

2023-10-26    分类: 网站建设

百度权重查询 站长交易 友情链接交换 网站监控 服务器监控 seo监控

网页的交互越来越复杂,&#106avascript 的异步操作也随之越来越多。如常见的 ajax 请求,需要在请求完成时响应操作,请求通常是异步的,请求的过程中用户还能进行其他的操作,不会对页面进行壅塞,这种异步的交互效果对用户来说是挺有友爱的。但是对于开发者来说,要大量处理这种操作,就很不友爱了。异步请求完成的操作必须预先定义在回调函数中,等到请求完成就必须调用这个函数。这种非线性的异步编程体例会让开发者很不适应,同时也带来了诸多的未便,增添了代码的耦合度和复杂性,代码的组织上也会很不优雅,大大降低了代码的可维护性。情况再复杂点,假如一个操作要等到多个异步 ajax 请求的完成才能进行,就会出现回调函数嵌套的情况,假如需要嵌套好几层,那你就只能自求多福了。</p><p>先看看下面这个常见的异步函数。</p><blockquote><p>var showMsg = function(){</p><p>setTimeout(function(){</p><p>alert( &lsquo;hello&rsquo; );</p><p>}, 5000 );</p><p>};</p></blockquote> <p>假如要给该函数添加回调,通常会这么干。</p><blockquote><p>var showMsg = function( callback ){</p><p>setTimeout(function(){</p><p>alert( &lsquo;hello&rsquo; );</p><p>// 此处添加回调</p><p>callback();</p><p>}, 5000 );</p><p>};</p></blockquote> <p>假如是使用 easy.js 的 Promise,添加回调的方法就会优雅多了,前提是需要将原函数封装成一个 promise 实例。</p><blockquote><p>var showMsg = function(){</p><p>// 构造promise实例</p><p>var promise = new E.Promise();</p><p>setTimeout(function(){</p><p>alert( &lsquo;hello&rsquo; );</p><p>// 改变promise的状况</p><p>promise.resolve( &lsquo;done&rsquo; );</p><p>}, 5000 );</p><p>// 返回promise实例</p><p>return promise;</p><p>};</p></blockquote> <p>将一个通俗的函数封装成一个 promise 实例,有3个关键步骤,步是在函数内部构造一个 promise 实例,第二步是部署函数执行完去改变 promise 的状况为已完成,第三步就是返回这个 promise 实例。每个 promise 实例都有3种状况,分别为 pending(未完成)、resolved(已完成,成功)、rejected(已拒绝,失败)。下面再来看看如何添加回调。</p><blockquote><p>showMsg().then(function( str ){</p><p>// 回调添加到这里来了</p><p>callback( str );</p><p>});</p></blockquote> <p>这样就将回调函数和原来的异步函数彻底的星散了,从代码组织上看,优雅了许多。resolve 接受一个参数,该参数就可以轻松实现将数据传送给使用 then 方法添加的回调中。</p><p>对于 ajax 请求,easy.js 直接将 ajax 方法封装成了 promise 对象,可以直接添加 then 方法往返调。</p><blockquote><p>E.ajax({</p><p>url : &lsquo;test1.php&rsquo;,</p><p>type : &lsquo;GET&rsquo;</p><p>})</p><p>then(function(){</p><p>// 添加请求成功的回调</p><p>}, function(){</p><p>// 添加请求失败的回调</p><p>});</p></blockquote> <p>then 方法接受2个函数作为参数,个函数是已完成的回调,第二个就是已失败的回调。</p><p>假如有上面提到的多个 ajax 请求的情况呢?那么就要用到 when 这个方法了。该方法可以接受多个 promise 实例作为参数。</p><blockquote><p>var requests = E.when(E.ajax({</p><p>url : &lsquo;test1.php&rsquo;,</p><p>type : &lsquo;GET&rsquo;</p><p>}), E.ajax({</p><p>url : &lsquo;test2.php&rsquo;,</p><p>type : &lsquo;GET&rsquo;</p><p>}));</p><p>requests.then(function( arg1, arg2 ){</p><p>console.log( &lsquo;success:&rsquo; + arg1[0] + arg2[0] );</p><p>}, function( arg1, arg2 ){</p><p>console.log( &lsquo;failure:&rsquo; + arg1 + arg2 );</p><p>});</p></blockquote> <p>when 方法是将多个 promise 实例存到一个数组中,等到该数组的所有 promise 实例都是已完成状况才去执行已完成的回调,一旦有一个实例是已拒绝的状况,则立即执行已拒绝的回调。</p><p>Promise 模式是&nbsp;CommonJS&nbsp;的规范之一。许多主流的 &#106avascript 库都有响应的实现,如 jQuery 和 Dojo 中,都有 Deferred 去实现这些功能。在这里照旧要吐槽下 jQuery 的 Deferred,撇开其内部使用,这应该用户使用率好低的一个模块了,这和其较复杂的使用体例有一定的关系。</p><p>假如你想深入的研究 easy.js 的 promise 源码,可以查看点击这儿的链接。</p><p>文章来源:夜雨带刀博客</p> <p> 当前标题:<a href="/news5/287955.html">使用Promise模式来简化&#106avascript的异步回调</a> <br> 本文路径:<a href="/news5/287955.html">/news5/287955.html</a> </p> <p> <a href="/" target="_blank">成都网站建设公司</a>_<a href="https://www.cdcxhl.cn/" target="_blank">创新互联</a>,为您提供<a href="/news/jingtai/">静态网站</a>、<a href="/news/ChatGPT/">ChatGPT</a>、<a href="/news/ymzc/">域名注册</a>、<a href="/news/xiangyingshi/">响应式网站</a>、<a href="/news/appsheji/">App设计</a>、<a href="/news/keywordsseo/">关键词优化</a> </p> <p class="adpic"> <a href="/service/ad.html" target="_blank" class="ad">广告</a> <a href="" target="_blank" class="adimg"><img src=""></a> </p> <p class="copy"> 声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: <a href="/" target="_blank">创新互联</a> </p> </div> <div class="newsmorelb"> <p>猜你还喜欢下面的内容</p> <ul> <li> <a href="/news4/287954.html">创新互联观点路径错了,就会出问题</a> <span>2023-10-26</span> </li><li> <a href="/news2/287952.html">网站制作要遵守的三个规矩</a> <span>2023-10-26</span> </li><li> <a href="/news0/287950.html">高端网站建设如何设计好看</a> <span>2023-10-26</span> </li><li> <a href="/news48/287948.html">模板网站:选择具有科学模板的建站系统</a> <span>2023-10-26</span> </li><li> <a href="/news46/287946.html">提醒中小企业老板,网站SEO五个注意事项</a> <span>2023-10-26</span> </li><li> <a href="/news44/287944.html">创造价值,四平网站建设助力企业拓展市场</a> <span>2023-10-26</span> </li><li> <a href="/news42/287942.html">企业网站设计需要强调什么</a> <span>2023-10-26</span> </li> </ul> </div> </div> <div class="col-lg-3 noneb"> <a href="/yunying.html" title="网站托管运营" target="_blank"><img src="/upload/ad_right/ad_wangzhantuoguan.jpg" alt="网站托管运营" class="img-responsive"></a> <div class="bkright"> <p><a href="/news/jianshe/">网站建设知识</a></p> <ul> <li> <a class="text_overflow" href="/news3/287953.html">怎么样更好的完成嘉定网站建设</a> <span>2023-10-26</span> </li><li> <a class="text_overflow" href="/news1/287951.html">网站设计增加用户体验,可以迎合用户习惯</a> <span>2023-10-26</span> </li><li> <a class="text_overflow" href="/news49/287949.html">网页制作要懂得留白才是有格调的</a> <span>2023-10-26</span> </li><li> <a class="text_overflow" href="/news47/287947.html">通辽小程序开发要注意哪些事项</a> <span>2023-10-26</span> </li><li> <a class="text_overflow" href="/news45/287945.html">建企业网站需要注意哪些内容?</a> <span>2023-10-26</span> </li><li> <a class="text_overflow" href="/news43/287943.html">北京网站建设公司经验总结:网站维护主要做什么?</a> <span>2023-10-26</span> </li><li> <a class="text_overflow" href="/news41/287941.html">外链质量分析,关键词排名</a> <span>2023-10-26</span> </li> <li> <a class="text_overflow" href="/news40/287940.html">网站定制:网站制作提防这些误区</a> <span>2023-10-26</span> </li><li> <a class="text_overflow" href="/news39/287939.html">网站建设之精简代码</a> <span>2023-10-26</span> </li><li> <a class="text_overflow" href="/news38/287938.html">网站设计:网站制作成功的原因</a> <span>2023-10-26</span> </li><li> <a class="text_overflow" href="/news37/287937.html">网站优化诊断做好seo审计工作</a> <span>2023-10-26</span> </li><li> <a class="text_overflow" href="/news36/287936.html">呼伦贝尔网站建设_网站开发_网站制作SEO优化</a> <span>2023-10-26</span> </li> </ul> </div> <div class="bkright tag"> <p><a href="/hangye/" target="_blank">同城分类信息</a></p> <ul> <li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="/hangye/shachuang/" target="_blank">纱窗</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="/hangye/zkj/" target="_blank">公路钻孔机</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="/hangye/ggtg/" target="_blank">广告推广</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="/hangye/gsdb/" target="_blank">工商代办</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="/hangye/shiliangting/" target="_blank">石凉亭</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="/hangye/wsjgd/" target="_blank">卫生间隔断</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="/hangye/ddcl/" target="_blank">电动窗帘</a> </li><li class="col-lg-6 col-md-6 col-sm-6 col-xs-6"> <a href="/hangye/vr/" target="_blank">VR全景</a> </li> </ul> </div> </div> </div> <footer> <div class="carousel-inner footjz"> <div class="container"> <i class="icon iconfont zbw"></i> 高品质定制 <i class="icon iconfont"></i> 跨终端自动兼容 <i class="icon iconfont"></i> 节约开发成本 <i class="icon iconfont"></i> 开发周期短 <i class="icon iconfont"></i> 一体化服务 <button type="button" class="btn btn-default btn-lg" onClick="window.location.href='tencent://message/?uin=631063699&Site=&Menu=yes'"> 立即开始2800定制网站建设</button> <button type="button" class="btn btn-default btn-xs" onClick="window.location.href='tencent://message/?uin=631063699&Site=&Menu=yes'"> 2800定制网站建设</button> </div> </div> <div class="carousel-inner bqsy"> <div class="container"> <div class="lxfs"> <h4 class="yutelnone">028-86922220 13518219792</h4> <h4 class="yutelblock"><a href="tel:02886922220">028-86922220</a> <a href="tel:13518219792">13518219792</a></h4> <a class="btn btn-default" href="tencent://message/?uin=532337155&Site=&Menu=yes" role="button">网站建设<span>QQ</span>:532337155</a> <a class="btn btn-default" href="tencent://message/?uin=631063699&Site=&Menu=yes" role="button">营销推广<span>QQ</span>:631063699</a> <a class="btn btn1 btn-default" href="mqqwpa://im/chat?chat_type=wpa&uin=532337155&version=1&src_type=web&web_src=oicqzone.com" role="button">网站制作<span>QQ</span>:532337155</a> <a class="btn btn1 btn-default" href="mqqwpa://im/chat?chat_type=wpa&uin=631063699&version=1&src_type=web&web_src=oicqzone.com" role="button">营销推广<span>QQ</span>:631063699</a> <a class="btn btn-default nonea" href="tencent://message/?uin=1683211881&Site=&Menu=yes" role="button">售后QQ:1683211881</a> <div class="dz">专注: <a href="https://www.xwcx.net/" target="_blank">服务器托管</a><a href="http://www.cdkjz.cn/" target="_blank">网站设计制作</a><a href="http://www.cxhljz.cn/" target="_blank">成都网站设计</a><a href="http://www.kswsj.com/" target="_blank">成都制作网站</a><a href="http://www.cxhlcq.com/" target="_blank">重庆网站制作</a> <address>地址:成都太升南路288号锦天国际A幢10楼</address> </div> </div> <div class="bzdh dz"><img src="../imges/bottom_logo.png" alt="创新互联"> <p><a href="/menu.html" target="_blank">成都创新互联科技有限公司</a><br> Tel:400-028-6601(7x24h)</p></div> </div> </div> </footer> <div class='link'> <a href='http://www.verzuimpartners.com'>2024欧洲杯竞猜官网</a> | <a href='http://www.its-our-pleasure.com'>BET体育官方网站(中国)有限公司</a> | <a href='http://www.vspflooring.com'>星空体育·(StarSky Sports)</a> | <a href='http://www.zeusalarm.com'>bet官方(中国)有限公司</a> | <a href='http://www.dragongardentogo.com'>在线体育竞猜(中国)有限公司</a> | <a href='http://www.terranuragica.com'>BET体育|中国有限公司</a> | <a href='http://www.haygg.com'>bat365在线平台·(中国)官方网站</a> | <a href='http://www.jebsenwineestates.com'>半岛·体育(中国)官方网站</a> | </div> </body> </html>