zoukankan      html  css  js  c++  java
  • jQuery之Deferred对象的使用

    详见:http://www.imooc.com/code/8907

    JavaScript的执行流程是分为"同步"与"异步"

    传统的异步操作会在操作完成之后,使用回调函数传回结果,而回调函数中则包含了后续的工作。这也是造成异步编程困难的主要原因:

    我们一直习惯于“线性”地编写代码逻辑,但是大量异步操作所带来的回调函数,会把我们的算法分解地支离破碎。

    嵌套式回调

    动画为例,下一个动画要等上一个执行完毕才可以继续,流程就会写到回调里面

    //执行多个动画
    $('ele1').animate({   opacity: '.5' }, 4000, function() {   $('ele2').animate({   '100px' }, 2000, function() {   $('ele3').animate({   height: '0' }, 2000); }); });

    上面的代码编程逻辑也是正确的,但是针对这样的异步嵌套的回调逻辑,当我们的嵌套越多,代码结构层级会变得越来越深。首先是阅读上会变得困难,其次是强耦合,接口变得不好扩展。我们需要一种模式来解决这种问题,这就是Promises所要做的事情。

    为了让前端们从回调的地狱中回到天堂, jQuery 也引入了 Promise 的概念。 Promise 是一种令代码异步行为更加优雅的抽象,有了它,我们就可以像写同步代码一样去写异步代码。这个东东看起来很复杂,实际上我们只要抓住核心的使用就可以了

    观察右边代码:

    通过$.Deferred处理过的代码,很明显没有了回调的嵌套,虽然代码量看起来多了点,但是实际上,每一个代码执行部分都被封装了起来,只留了Deferred的接口处理了,等于是我们把执行的流程控制交给了Deferred,这样的好处就是我们在写嵌套函数的时候,可以用deferred提供的管道风格编写同步代码了

    dtd.then(function() {
      //操作1
    }).then(function() {
      //操作2
    }).then(function() {
      //操作3
    })

    这里要了解3个步骤

    var dtd = $.Deferred(); //创建
    dtd.resolve(); //成功
    dtd.then() //执行回调

  • 相关阅读:
    C# Net Core 使用 ClientWebSocket 实现 WebSocket 客户端
    C# Net 使用 RSA 加密解密 OpenSSL 生成的密码
    VS 代码提示默认不选中 解决办法
    C# While 超时设置
    C# 比较日期格式中的年月大小
    C#实现QQ邮箱IMAP之邮件处理
    Windwos服务之定时发送邮件(一)
    js基于“合成大西瓜的”碰撞模型(一)
    Windows下,通过运行直接打开软件
    C#爬取国家统计局五级地址
  • 原文地址:https://www.cnblogs.com/3body/p/5417238.html
Copyright © 2011-2022 走看看