Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery延迟对象_Javascript_Jquery_Queue - Fatal编程技术网

Javascript jQuery延迟对象

Javascript jQuery延迟对象,javascript,jquery,queue,Javascript,Jquery,Queue,我正在开发一个“单页应用程序”,我正在寻找一种确保页面渲染完成的方法 我的应用程序流程如下所示: 绘制导航标记 添加一个表示正在获取页面内容的覆盖 实际加载内容并将其注入页面内容区域 这就是我的不足之处: 注入页面内容后,我初始化标记相关的小部件(引导、自定义事件等) 这意味着,页面内容仍然可以被操纵,因此,我想知道 我可以使用jQuery的延迟对象(以及如何)作为函数队列,使用可以执行异步操作的函数以及普通的旧同步函数 使用它,我希望能够知道何时所有小部件都已初始化,然后删除页面加载指示器。您

我正在开发一个“单页应用程序”,我正在寻找一种确保页面渲染完成的方法

我的应用程序流程如下所示:

  • 绘制导航标记
  • 添加一个表示正在获取页面内容的覆盖
  • 实际加载内容并将其注入页面内容区域
  • 这就是我的不足之处:

    注入页面内容后,我初始化标记相关的小部件(引导、自定义事件等)

    这意味着,页面内容仍然可以被操纵,因此,我想知道 我可以使用jQuery的延迟对象(以及如何)作为函数队列,使用可以执行异步操作的函数以及普通的旧同步函数


    使用它,我希望能够知道何时所有小部件都已初始化,然后删除页面加载指示器。

    您可以使用jQuery的延迟对象创建异步函数队列

    下面是一个示例实现(由jsfiddle/coffeeandcode实现):

    您可以在此处看到正在运行的代码:


    是的,您可以使用承诺来知道几个异步函数何时完成,但您希望我们回答什么,没有代码,只是一个相当模糊的问题?小部件提供了什么反馈?他们是否向您承诺何时完成初始化?我更新了我的问题,我正在寻找这种用法的示例,甚至可能是一篇好文章,因为我找不到有助于我理解这个概念的文章。@Bergi目前没有,但我意识到代码重构是正确的
    var Queue = function() {
        var lastPromise = null;
    
        this.add = function(obj, method, args, context) {
            var methodDeferred = $.Deferred();
            var queueDeferred = this.setup();
            if(context === undefined) { context = obj; }
    
            // execute next queue method
            queueDeferred.done(function() {
    
    
                // call actual method and wrap output in deferred
                setTimeout(function() {
                    obj[method].apply(context, args);
                    methodDeferred.resolve();
                }, 100);
    
    
            });
            lastPromise = methodDeferred.promise();
        };
    
        this.setup = function() {
            var queueDeferred = $.Deferred();
    
            // when the previous method returns, resolve this one
            $.when(lastPromise).always(function() {
                queueDeferred.resolve();
            });
    
            return queueDeferred.promise();
        }
    };