当前位置: 首页 > 面试题库 >

如何使用jQuery延迟?

丁宏浚
2023-03-14
问题内容

jQuery
1.5带来了新的Deferred对象和附加的方法.when.Deferred以及._Deferred

对于那些以前从未使用.Deferred过的用户,我已经为其添加了注释。

这些新方法的可能用途是什么,我们如何将它们适应模式?

我已经阅读了API和[源代码,所以我知道它的作用。我的问题是我们如何在日常代码中使用这些新功能?

我有一个缓冲区类的简单示例,该类按顺序调用AJAX请求。(上一个完成后,下一个开始)。

/* Class: Buffer
 *  methods: append
 *
 *  Constructor: takes a function which will be the task handler to be called
 *
 *  .append appends a task to the buffer. Buffer will only call a task when the 
 *  previous task has finished
 */
var Buffer = function(handler) {
    var tasks = [];
    // empty resolved deferred object
    var deferred = $.when();

    // handle the next object
    function handleNextTask() {
        // if the current deferred task has resolved and there are more tasks
        if (deferred.isResolved() && tasks.length > 0) {
            // grab a task
            var task = tasks.shift();
            // set the deferred to be deferred returned from the handler
            deferred = handler(task);
            // if its not a deferred object then set it to be an empty deferred object
            if (!(deferred && deferred.promise)) {
                deferred = $.when();
            }
            // if we have tasks left then handle the next one when the current one 
            // is done.
            if (tasks.length > 0) {
                deferred.done(handleNextTask);
            }
        }
    }

    // appends a task.
    this.append = function(task) {
        // add to the array
        tasks.push(task);
        // handle the next task
        handleNextTask();
    };
};

我在寻找示威和可能的用途.Deferred.when

看到的例子也很有趣._Deferred

链接到新jQuery.ajax资源的例子是作弊。

当我们抽象出一个操作是同步还是异步完成时,我对什么技术可用特别感兴趣。


问题答案:

我能想到的最佳用例是缓存AJAX响应。这是RebeccaMurphey关于该主题的介绍性帖子

var cache = {};

function getData( val ){

    // return either the cached value or jqXHR object wrapped Promise
    return $.when(
        cache[ val ] || 
        $.ajax('/foo/', {
            data: { value: val },
            dataType: 'json',
            success: function( resp ){
                cache[ val ] = resp;
            }
        })
    );
}

getData('foo').then(function(resp){
    // do something with the response, which may
    // or may not have been retrieved using an
    // XHR request.
});

基本上,如果该值在从缓存立即返回之前已经被请求一次。否则,AJAX请求将获取数据并将其html" target="_blank">添加到缓存中。的$.when/ .then不关心任何的这一点;
您需要关心的就是使用响应,.then()在两种情况下都将响应传递给处理程序。jQuery.when()手柄的非无极/延迟作为一个已完成,立即执行任何.done().then()上链。

对于任务可能会异步执行或可能不会异步执行以及您希望从代码中抽象出该条件的情况,Deferreds非常适合。

使用$.when助手的另一个真实示例:

$.when($.getJSON('/some/data/'), $.get('template.tpl')).then(function (data, tmpl) {

    $(tmpl) // create a jQuery object out of the template
    .tmpl(data) // compile it
    .appendTo("#target"); // insert it into the DOM

});


 类似资料:
  • 本文向大家介绍一定延迟后如何调用jQuery函数?,包括了一定延迟后如何调用jQuery函数?的使用技巧和注意事项,需要的朋友参考一下 要在一定延迟后调用jQuery函数,请使用方法。在这里,几秒钟后调用jQuery函数。 您可以尝试运行以下代码,以了解如何使用jQuery中的方法在延迟后调用jQuery函数- 示例

  • 问题内容: 我的页面上有几个画廊,包括手风琴和滑杆。问题是页面需要永久加载。有没有一种方法可以将图像包装在一些代码中或对它应用类以强制仅在加载所有其他内容之后才加载它? 问题答案: 你当然可以。将您的img src属性替换为“#”,然后添加一个自定义属性,如下所示: 然后,在页面加载时添加一条JavaScript行,该行的内容如下所示:

  • 问题内容: 我创建了基于 HTML: JS: 如您所见,我尝试通过2种方式在3秒后更改为,但没有人为我工作。真的很奇怪 我错过了什么? 实际上,我尝试在从Ajax获得响应后更改值,但是假设应该是相同的问题。 谢谢, 这是我的示例:http : //jsfiddle.net/6uKAT/20/ 问题答案: 尝试使用: Angular的window.setTimeout包装。fn函数包装在try /

  • 我正在使用slick.js构建一个旋转木马。但是,即使我将属性从更改为,在我滚动到该图像之前,图像仍然会被加载。我怀疑这是因为我的图像中有标记。我的问题是如何防止浏览器加载响应图像,或者如何正确地延迟加载响应图像。 这是我的img标签的样本

  • 问题内容: 我想将我的模块/ SDK中的promise返回到非角度javascript。例如,如果我将承诺返回给jQuery,则可能应该发送jQuery延迟对象。如何将Angular promise转换为jquery promise / deferred obj。 任何建议,不胜感激。 问题答案: 免责声明 :jQuery的承诺不与其他图书馆发挥不错-在 所有 。jQuery不会自行吸收其他第三方

  • 问题内容: 我正在尝试用Java做某事,而我需要一些东西在while循环中等待/延迟几秒钟。 我想构建一个步进音序器,并且对Java还是陌生的。有什么建议么? 问题答案: If you want to pause then use java.util.concurrent.TimeUnit: TimeUnit.SECONDS.sleep(1); TimeUnit.MINUTES.sleep(1);