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

没有UI块的功能处理链

邵凯定
2023-03-14
问题内容

我需要在JavaScript / jQuery中执行几个功能,但我想避免阻塞UI。

AJAX不是一个可行的解决方案,由于应用程序的性质,这些功能很容易达到数千种。异步执行此操作将终止浏览器。

因此,我需要某种方式链接浏览器需要处理的功能,并且仅在第一个功能完成后才发送下一个功能。

该算法是这样的

适用于2到15步

HTTP:获取当前步骤的项目数量(范围从几百到几千)

对于每个项目,HTTP:获取结果

如您所见,我有两个我需要管理的GET-request-“ chains” …特别是最内层的循环,如果异步完成的话,会使浏览器立即崩溃-
但我仍然希望用户能够操作页面,因此纯(阻塞)同步方式将不起作用。


问题答案:

您可以轻松地异步执行此操作,而无需一次触发所有请求。您需要做的就是管理队列。为了清楚起见,以下是伪代码。它很容易转换为真实的AJAX请求:

// Basic structure of the request queue. It's a list of objects
// that defines ajax requests:
var request_queue = [{
    url : "some/path",
    callback : function_to_process_the_data
}];

// This function implements the main loop.
// It looks recursive but is not because each function
// call happens in an event handler:
function process_request_queue () {
    // If we have anything in the queue, do an ajax call.
    // Otherwise do nothing and let the loop end.
    if (request_queue.length) {
        // Get one request from the queue. We can either
        // shift or pop depending on weather you prefer
        // depth first or breadth first processing:
        var req = request_queue.pop();
        ajax(req.url,function(result){
            req.callback(result);
            // At the end of the ajax request process
            // the queue again:
            process_request_queue();
        }
    }
}

// Now get the ball rolling:
process_request_queue();

因此,基本上,我们将ajax调用本身转换为伪循环。基本上,这是递归完成的经典延续编程风格。

在您的情况下,请求的示例为:

request_queue.push({
    url : "path/to/OUTER/request",
    callback : function (result) {
        // You mentioned that the result of the OUTER request
        // should trigger another round of INNER requests.
        // To do this simply add the INNER requests to the queue:

        request_queue.push({
            url : result.inner_url,
            callback : function_to_handle_inner_request
        });
    }
});

这非常灵活,因为您不仅可以选择以广度优先还是深度优先(shift与pop)处理请求。但是,您也可以使用splice将内容添加到队列的中间,或者使用unshift
vs push将请求放置在队列的开头以处理高优先级的请求。

您还可以通过在每个循环中弹出多个请求来增加同时请求的数量。只需确保process_request_queue每个循环仅调用一次即可避免同时请求呈指数增长:

// Handling two simultaneous request channels:
function process_request_queue () {
    if (request_queue.length) {
        var req = request_queue.pop();
        ajax(req.url,function(result){
            req.callback(result);
            // Best to loop on the first request.
            // The second request below may never fire
            // if the queue runs out of requests.
            process_request_queue();
        }
    }
    if (request_queue.length) {
        var req = request_queue.pop();
        ajax(req.url,function(result){
            req.callback(result);
            // DON'T CALL process_request_queue here
            // We only want to call it once per "loop"
            // otherwise the "loop" would grow into a "tree"
        }
    }
}


 类似资料:
  • 问题内容: 当查看该方法的源代码时,我发现以下语法:存在没有主体的导出函数签名,以及包含实现的同一签名的非导出版本: 我认为这是一些语法,可让您轻松导出本地函数。那是对的吗?为什么不这样做而不仅仅是拥有一个导出函数并在包中使用它呢? 问题答案: 根据Go语言规范。 函数声明可以省略主体。这样的声明为Go外部实现的功能(例如汇编例程)提供了签名。 在这种情况下,该功能由386中的体系结构特定的汇编文

  • 我有一个包含两个功能的处理应用程序。第一个被称为加载屏幕。第二个叫做主菜单。当应用程序初始化时,它调用函数“loadScreen();”。我在这个函数中设置了一个计时器,这样5秒钟后,它就会跳转到“主菜单”。问题是,如何停止我的函数并调用另一个函数?有没有“Rest”或者我可以使用的“停止”功能?谢谢

  • 主要内容:文章目录,1.用户登录权限效验,2.统一异常处理,3.统一数据返回格式统⼀⽤户登录权限验证 统⼀数据格式返回 统⼀异常处理 1.用户登录权限效验 1.1 最初的用户登录验证 每个⽅法中都要单独写⽤户登录验证的⽅法,即使封装成公共⽅法,也⼀样要传参调⽤和在⽅法中进⾏判断。 添加控制器越多,调⽤⽤户登录验证的⽅法也越多,这样就增加了后期的修改成本和维护成本。 1.2 Spring AOP 用户统一登录验证的问题 没办法获取到 HttpSession 对象。 要对⼀部分⽅

  • 本文向大家介绍PHP错误和异常处理功能模块示例,包括了PHP错误和异常处理功能模块示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP错误和异常处理功能模块。分享给大家供大家参考,具体如下: 一、错误类型和基本的调试方法 PHP程序的错误发生一般归属于下列三个领域: 语法错误: 语法错误最常见,并且也容易修复。如:代码中遗漏一个分号。这类错误会阻止脚本的执行。 运行时错误: 这种错误

  • 问题内容: 我对像numpy这样的库如何工作有疑问。导入时,我可以访问许多内置的类,函数和常量,例如,等等。 但是在numpy中,还有其他子模块,例如numpy.testing。 怎么做?以我有限的经验,带有子模块的模块只是带有文件的文件夹,而带有功能/类的模块是实际的python文件。如何创建一个同时具有功能/类的模块“文件夹”? 问题答案: 包含文件和的文件夹称为。包含类和函数的文件之一是。文

  • 【UI 模块性能】页面主要展示项目运行过程中 UI 模块的CPU占用情况,主要包括以下几个部分: 数据汇总 该项主要展示项目运行过程中的“CPU峰值”、“CPU均值”、“堆内存分配总值”和“堆内存均值”。其中,“CPU均值”和“堆内存分配均值”表示UI模块平均每帧的CPU占用和堆内存分配。 UI 模块总体耗时 & 耗时详情 UI 模块总体CPU耗时 主要展示项目运行过程中 UI 模块的整体耗时情况