精华内容
下载资源
问答
  • Deferred

    2019-09-27 19:09:19
    上文中提到了Promise构造函数,就不得不提Deferred(延迟)对象了,其实,让Deferred对象得到推广的便是其在jQuery中的使用,本文就jQuery中对Deferred对象的使用进行探讨。 1、Deferred的概念 延迟对象,在jQuery...

    上文中提到了Promise构造函数,就不得不提Deferred(延迟)对象了,其实,让Deferred对象得到推广的便是其在jQuery中的使用,本文就jQuery中对Deferred对象的使用进行探讨。

    1、Deferred的概念

    延迟对象,在jQuery的1.5引入,是通过调用jQuery.Deferred()方法创建一个可链式调用的工具对象。 它可以注册多个回调到回调队列, 调用回调队列,准备代替任何同步或异步函数的成功或失败状态。

    延迟对象是可链式调用的,类似于jQuery对象是可链接的方式,  但它有其自己的方法。 创建一个Deferred(延迟)对象后,你可以通过方法 直接从对象创建或者链式调用 或 保存对象的一个变量,调用该变量的一个或多个方法。

     jQuery.Deferred()基于Promises/A规范实现,因为jQuery本身的设计风格,jQuery.Deferred()并没有完全遵循Promises/A规范。
    jQuery在1.5版本中首次引入了Deferred。你可以通过jQuery.Deferred() 在未来某个时候 得到 ‘延时’返回值。 在此之前是无法单独使用的,Deferred作为对ajax模块较大重写的一部分添加进来。1.5和1.6版本包含Deferred功能,可以使$.ajax() 接收调用完成及请求出错的回调,但却存在严重的耦合。新版本的jQuery提供了一些增强的方式来管理回调,提供更加灵活的方式建立回调,而不用关心原始的回调是否已经触发。 jQuery的Deferred对象支持多个回调绑定多个任务,任务本身既可以是同步也可以是异步的。
    Deferred对象有三种状态,pending:未完成,resolved:已完成,rejected:未完成。(注:和Promise对象中的状态一模一样呢!)
     
    2、初试牛刀

     先看看$.Deferred是 什么?

    可以看出Deferred只是一个定义在jQuery上的普通方法,没有太多的信息,那我们调用一下试试。

    我们又可以看出,其实Deferred函数其实返回的是一个对象,这个对象也有always、catch、done、fail、notity、notifyWith、pipe、promise、progress、reject、rejectWith、resolve、resolveWith、state、then方法。

    Deferred有三个状态,pending:未完成,resolved:操作成功,rejected: 操作失败

    当deferred1对象调用resolved时,deferred1中的done方法会被调用,当deferred1对象调用rejected时,deferred1的fail方法会被调用,比如

    var deferred1 = $.Deferred();
    deferred1.done(function (data) {
        console.log('success: ',  data)
    })
    deferred1.fail(function (err) {
        console.log('err: ', err)
    })
    setTimeout(function(){
      deferred1.resolve('victory')
    },200)

    //输出success: victory

    3、Promise对象的方法

    我们接着聊notify和progress。

    progress()用来指定一个回调函数,当调用notify()方法时,该回调函数将执行。它的用意是提供一个接口,使得在非同步操作执行过程中,可以执行某些操作,比如定期返回进度条的进度。

    var userProgress = $.Deferred();
    var $profileFields = $("input");
    var totalFields = $profileFields.length;
    userProgress.progress(function (filledFields) {
        var pctComplete = (filledFields/totalFields)*100;
        $("#progress").html(pctComplete.toFixed(0));
    }); 
    userProgress.done(function () {
        $("#thanks").html("Thanks for completing your profile!").show();
    });
    $("input").on("change", function () {
        var filledFields = $profileFields.filter("[value!='']").length;
        userProgress.notify(filledFields);
        if (filledFields == totalFields) {
            userProgress.resolve();
        }
    });

     

    现在接着聊then方法,then方法接收三个回调函数,第一个参数是resolve时调用的回调函数,第二个参数是reject时调用的回调函数,第三个参数是progress()方法调用的回调函数。

     

    和谈Promise一样,现在我们也Deferred来封装一个getJSON函数,实现AJAX的例子

    var getJSON = function(url) {
        var deferred = $.Deferred();
       var client = new XMLHttpRequest(); client.open('GET', url); client.onreadystatechange = function(){ if (this.readyState !== 4) { return } if (this.status === 200) { deferred.resolve(this.response) } else { deferred.reject(new Error(this.statusText)) } } return deferred } getJSON('/db.json').then(function(json){ console.log('Result:', json) }, function(error){ console.log('error:', error) })

     

    4、Deferred中的promise对象

    大多数情况下,我们不想让用户从外部更改deferred对象的状态。这时,你可以在deferred对象的基础上,返回一个针对它的promise对象。我们可以把后者理解成,promise是deferred的只读版,或者更通俗地理解成promise是一个对将要完成的任务的承诺。

    你可以通过promise对象,为原始的deferred对象添加回调函数,查询它的状态,但是无法改变它的状态,也就是说promise对象不允许你调用resolve和reject方法。

    function getPromise(){
        return $.Deferred().promise();
    }
    try{
        getPromise().resolve("a");
    } catch(err) {
        console.log(err);
    }
    //会进入catch方法,显示TypeError {}

    jQuery的ajax() 方法返回的就是一个promise对象。

     

     
    

    转载于:https://www.cnblogs.com/wbxjiayou/p/7205056.html

    展开全文
  • deferred

    2018-10-24 18:01:57
  • #Deferred.JS 介绍 Deferred.JS 可以轻松处理异步进程(如AJAX等)。 Deferred.JS 是JQuery Deferred objects的替代品。 (行为与 JQuery Deferred 相同)。 阅读以了解为什么您应该从 JQuery Deferred 迁移到 ...
  • deferred对象

    2015-04-01 18:37:35
    deferred

    deferred

    deferred对象是什么

    deferred对象就是jQuery的回调函数解决方案

    开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。
    其中,既有异步的操作,
    也有同步的操作,它们都不是立即能得
    到结果的。通常的做法是,为它们指定回调函数(callback)。
    即事先规定,一旦它们运行结束,应该调用哪些函数。

    它解决了如何处理耗时操作的问题,对那些操作提供了更好的控制,以及统一的编程接口。

    主要功能

    ajax操作的链式写法

    jQuery的ajax操作的传统写法见demo1

    新的写法 demo2
    1.5以上版本返回deferred对象,可以进行链式操作,提高可读性

    指定同一操作的多个回调函数

    deferred对象的一大好处,就是它允许你自由添加多个回调函数。
    demo2 中 如果ajax操作成功后,除了原来的回调函数,我还想再运行一个回调函数,怎么办?
    很简单,直接把它加在后面就行了。

    为多个操作指定回调函数

    deferred对象的另一大好处,就是它允许你为多个事件指定一个回调函数,这是传统写法做不到的。
    demo3

    普通操作的回调函数接口

    deferred对象的最大优点,就是它把这一套回调函数接口,
    从ajax操作扩展到了所有操作。也就是说,任何一个操作—-
    不管是ajax操作还是本地操作,也不管是异步操作还是同步操作—-
    都可以使用deferred对象的各种方法,指定回调函数。

    demo4 有问题
    改成 demo5

    deferred.resolve()方法和deferred.reject()方法

    jQuery规定,deferred对象有三种执行状态—-未完成,
    已完成和已失败。如果执行状态是”已完成”(resolved),deferred
    对象立刻调用done()方法指定的回调函数;如果执行状态是”已失败”
    ,调用fail()方法指定的回调函数;如果执行状态是”未完成”,
    则继续等待,或者调用progress()方法指定的回调函数

    resolve()将dtd对象的执行状态从”未完成”改为”已完成”,从而触发done()方法。
    reject()方法将dtd对象的执行状态从”未完成”改为”已失败”,从而触发fail()方法。见demo6

    deferred.promise()方法

    上面这种写法,还是有问题。那就是dtd是一个全局对象,
    所以它的执行状态可以从外部改变。见demo7

    为了避免这种情况,jQuery提供了deferred.promise()方法。
    它的作用是,在原来的deferred对象上返回另一个deferred对象。
    后者只开放与改变执行状态无关的方法(比如done()方法和fail()方法),
    屏蔽与改变执行状态有关的方法(比如resolve()方法和reject()方法)
    demo8

    还可以直接在wait对象上部署deferred接口
    demo9

    总结

    (1) $.Deferred() 生成一个deferred对象。
    (2) deferred.done() 指定操作成功时的回调函数
    (3) deferred.fail() 指定操作失败时的回调函数
    (4) deferred.promise() 没有参数时,返回一个新的deferred对象,该对象的运行状态无法被改变;接受参数时,作用为在参数对象上部署deferred接口。
    (5) deferred.resolve() 手动改变deferred对象的运行状态为"已完成",从而立即触发done()方法。
    (6)deferred.reject() 这个方法与deferred.resolve()正好相反,调用后将deferred对象的运行状态变为"已失败",从而立即触发fail()方法。
    (7) $.when() 为多个操作指定回调函数。
    (8)deferred.then()可以把done()和fail()合在一起写如果then()有两个参数,那么第一个参数是done()方法的回调函数,第二个参数是fail()方法的回调方法。如果then()只有一个参数,那么等同于done()。
    (9)deferred.always()这个方法也是用来指定回调函数的,它的作用是,不管调用的是deferred.resolve()还是deferred.reject(),最后总是执行。
    

    转自阮一峰的博客

    展开全文
  • 主要介绍了jQuery中Deferreddeferred.promise()方法,提醒千万要注意deferred.promise()与jQuery的.promise() 实例方法的区别,需要的朋友可以参考下
  • 使用 $.Deferred 的示例项目。 作者:Peter Ajtai & Jonathan Waltner 要尝试访问以下网站并玩转: 或按照以下步骤破解: 确保已安装和 。 运行npm install 运行grunt server $.Deferred Deferred 是一种管理...
  • - deferred shading - attribute stage:画所有geometry。把depth, normal, specular color, diffuse color, emissive color都写到G-buffer上 - deferred stage:画光源。把算出来的irradiance累加的output ...
    # brief
    
    - 所谓tile based deferred shading(渲染算法,非mobile gpu的tbdr架构),就是把deferred shading的shading阶段的二层循环的顺序换一下,不再是一个个光源地draw,而是一个个tile地draw(每个tile有light list)
    - tile based forward shading,就是先把影响每个tile的lightlist搞出来,然后用texture来存。接下来就是正常的forward shading,唯一的不同是shader上去找当前fragment所在的tile的light list,然后循环算光照叠加
    - clustered shading使劲吹,但是需要compute shader,而且自己都承认了有时候light assign的消耗offset了更少的光源计算的消耗

    # 17.1 introduction
    - deferred shading的优势
        - decouple shading&lighting from geometry management, allow efficient submission
        - minimize lighting computation, 文中说这点变得不重要了(我觉得胡扯吧,啥时候不重要了)
    - deferred shading的劣势
        - bandwidth(如果一个pixel被N个光源照到,那这个点的gbuffer要被访问N次,而这点可以被tiled deferred shading优化)
        - memory占用(tiled deferred shading对此无任何作用)
    - tiled deferred shading
        - tile based deferred 在没MSAA和transparency的情况下比tile based forward shading有效率优势
        - 支持transparency
        - 不再有GBuffer的要求
        - 能用MSAA(deferred说是在同等MSAA quality下效率就差很多了),另外在8x情况下deferred还有memory contraint的问题


    # 17.2 Recap: Forward, Deferred, and Tiled Shading
    - deferred的tiled和非tiled区别
        - 在shading阶段,是个2层循环,loop over light和loop over pixel
        - tiled的外层loop是pixel:把屏幕划分成tile,要找出影响每个tile的light。渲染每个tile的时候就是对pixel来loop light
        - 非tiled的外层是light:loop over light,对每个light cover到的区域算光照然后累加到extant radiance buffer上
        - key difference:tiled deferred shading只需要读gbuffer once、framebuffer也只要写1次,common term可以缓存使用(在shader的local变量种),执行更coherent
    - cluster shading
        - 随便一提:说是能更rebust地处理complex的geometry和light configuration
        - 是tiled shading的改进,更复杂


    # 17.3 Tiled Forward Shading: Why?
    - deferred shading的weakness
        - transparency/blend没法直接搞
        - memory和bandwidth,再加上MSAA memory就更不好搞了
        - 多种shader支持
    - tiled forward shading硬件支持要求低

    # 17.4 Basic Tiled Forward Shading
    - walkthrough
        - subdivide screen into tiles
        - optional pre-Z pass
        - optional find minZ,maxZ of each tile
            - 通过loop来reduce出每个tile的min max,用来判断light到底是否影响这个tile
        - assign lights to tile
            - 可以cpu上做,比如1080p 32x32 tile的时候只有2k个tile,而且light的数量一般也少(书上说几k个light还少。。。)
            - 也可以GPU上用compute shader
        - render geometry, compute shading

    # 17.5 Supporting Transparency
    - tile min max做文章

    # 17.6 Support for MSAA
    - 强行用带宽、memory、高MSAA倍数来对比deferred和forward

    # 17.7 Supporting Different Shaders
    - deferred shading只能用material id + dynamic branch来搞了吗?

    # 17.8 Conclusion and Further Improvements
    - 吹clustered shading

    # after thought
    - 如果我们能在纯forward shading里,把primitive也按照tile做排序,会有性能提升嘛?在mobile上
    展开全文
  • Deferred总结

    2016-03-07 18:39:29
    Deferred总结
  • jquery ajax deferred

    2014-04-09 16:21:04
    deferred
  • jq deferred

    2015-03-22 21:05:45
    deferred promise
  • 主要介绍了jQuery之Deferred对象详解,本文深入剖析了jQuery Deferred对象的方法属性等内容,需要的朋友可以参考下
  • DeferredShading

    2009-03-25 11:28:29
    DeferredShading,基于DX10的DeferredShading效果。讲解十分详细
  • 与jQuery的Deferred类似,但这是一个Promise包装器。 使用情况 var Deferred = require ( '@lenic/deferred' ) ; const deferred = Deferred ( ) ; deferred . promise . then ( v => console . log ( v ) , e => ...
  • 我想在不希望包含整个大型jQuery库但使用例如zepto的项目中使用出色的Deferred接口。 这个项目试图尽可能地模仿$ .Defered,但是如果有差异,我也不会感到惊讶。 兼容性 需要Array.prototype.forEach。 测验 该...
  • Deferred Shading vs. Deferred Lighting

    千次阅读 2016-10-17 20:55:01
    Deferred Shading VS Deferred Lighting http://www.realtimerendering.com/blog/deferred-lighting-approaches/
  • jQuery Deferred

    2015-03-10 16:17:43
    jQuery.Deferred( [beforeStart ] ) 创建一个Deferred对象。 beforeStart: 类型: Function( Deferred deferred ) 一个在构造函数返回前运行的处理函数。   resolve、reject、notify ...
  • Deferred Lighting

    2019-09-24 04:24:25
    Deferred lighting separate lighting from rendering and make lighting a completely image-space technique. This is very different from the forward rendering. At first as the limitation of the hardw...
  • 目录Deferred Shading Basicspreparerendershader小结 Deferred Shading Basics prepare loadAssets: 加载地板和模型, 及其材质贴图 prepareOffscreenFramebuffer: 准备Gbuffer createAttachment: pos ...
  • deferred对象就是jQuery的回调函数解决方案。在英语中,defer的意思是"延迟",所以deferred对象的含义就是"延迟"到未来某个点再执行。
  • Process/Deferred

    2019-09-21 18:25:26
    Process/DeferredProcess和Deferred Process和Deferred Deferred主要是用于内部,来维护异步模型的状态。 Promise只要用于外部,通过then()方法,暴露给外部调用,以添加业务逻辑和业务的组装。 deferred分为...
  • 比如Deferred Shading以及其之后的Deferred Lighting。Deferred方法相对于传统Forward Rendering最主要区别都是提高了对多光源渲染时的效率,它是是将光源的计算转到屏幕空间来进行,进而不浪费无效的光源着色。
  • jquery deferred

    2019-04-22 16:06:09
    http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html https://blog.csdn.net/lihongxun945/article/details/11581579 http://www.ruanyifeng.com/blog/201...
  • 一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们都不是立即能得到结果的...
  • Deferred对象

    2015-03-30 20:16:02
    Deferred对象是由$.Deferred构造的,$.Deferred被实现为简单工厂模式。 它用来解决JS中的异步编程,它遵循 Common Promise/A 规范。实现此规范的还有 when.js 和 dojo。   $.Deferred作为新特性首次...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,514
精华内容 17,805
关键字:

deferred