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

在进程运行时更新网页

柳深
2023-03-14
问题内容

我有一个页面,其中发生了许多耗时的功能。我想做的是在过程的每个步骤完成后,更新网页以使用户知道刚刚完成的步骤。本质上,用户提交查询,然后服务器查询数据库,处理数据,绘制图像并在页面上显示结果。我想让网页说出该功能执行的步骤。它会说“先查询”然后“正在处理”
…等等。

伪:

protected void Search(object sender, EventArgs e){

    //display that the process has begun
    List queryResults = Query()
    //display that the query is finished
    foreach(item in queryResults){
       ProcessItem(item)
       //display that item has been processed
       Render(item)
       //display item has been rendered
    }

}

我已经研究过使用Ajax来更新页面而不重新加载它,但是根据我的简单理解(对Ajax零经验),客户端将向服务器请求文件。我需要Ajax工具吗?如果是这样,这是否意味着我将在受评论的区域中向客户端发送一个ajax响应?


问题答案:

Web服务器无法将未经请求的数据推送到客户端。他们服从请求-响应周期。另一种方法是使用消息队列,但会大大增加复杂性。

从客户端轮询还不错。Web服务器擅长处理许多短请求,并且2到3秒的轮询间隔应该足够快。

这是我喜欢使用的一种轮询方法。它异步等待响应返回,然后再次轮询(需要jQuery):

function poll(url, task, progressBar, resultsCallback, 
        timeoutMillis, pollIntervalMillis) {
    $.ajax({
        url: url,
        type: 'GET',
        dataType: 'json',
        timeout: timeoutMillis,
        data: 'action=poll&task='+task,
        success: (function(response, status, xhr) {
            if ('progress' in response) {

                // update the UI with the progress
                progressBar.setValue(response.progress);
            }
            if ('status' in response) {
                if (response.status == 'pending') {

                    // task is not finished, continue polling
                    setTimeout((function() {
                        poll(url, task, progressBar, resultsCallback, 
                                timeoutMillis, pollIntervalMillis);
                    }), pollIntervalMillis);
                }
                else {

                    // task completed
                    if (response.status == 'cancelled') {
                        progressBar.setColor('red');
                        progressBar.setText("Task '"+task+"' was cancelled");
                    }
                    else {
                        progressBar.setColor('green');
                        progressBar.setText("Task '"+task+"' complete");
                    }

                    // GET the results
                    $.ajax({
                        url: url,
                        type: 'GET',
                        timeout: timeoutMillis,
                        data: 'action=results&task='+task,
                        success: (function(response, status, xhr) {
                            resultsCallback(response, status, xhr);
                        }),
                        error: error
                    });
                }
            }
        }),
        error: error
    });

    function error(xhr, status, err) {
        alert('Failure to communicate with server: ' + status + ', ' + err);
    }
}

并且您的服务器端代码应使用以下内容响应轮询:

{"progress" : 42, "status" : "pending"}


 类似资料:
  • 我在GXT网格中创建了一个按钮单元格,并将该单元格添加到我的网格列中,如下所示 现在所有单元格都被绘制出来了,之后取决于服务器调用,我想用一个新值MyDTO更新我的单元格。 所以在我的RPC成功后,我想为我的所有单元格调用这个渲染并更新那里的值。我如何实现这一点。

  • 问题内容: 大约一年前,我偶然发现了Java的一个不错的功能,我一生都找不到。 通过一些魔术接口,显然可以在运行时声明一些可替换的类或函数。 我找到了一个很好的示例指南,该人运行了一个简单的小程序,该程序打印了一条特定的消息,然后他使用一种我不记得的方法更新了该程序,然后突然该程序将旧的打印功能替换为新的打印功能。 我尝试浏览Java API来激发我的记忆力和谷歌搜索功能,但没有成功。有人可以帮忙

  • 问题内容: 该示例非常简单:我想通过仅显示文本(canvas.drawText())来让用户知道应用程序在做什么。然后,出现我的第一条消息,而不是其他消息。我的意思是,我有一个“ setText”方法,但它不会更新。 该视图的文本绘制仅通过在onDraw();中执行一个drawText来起作用,因此setText更改了文本但不显示它。 有人建议我用SurfaceView替换视图,但是仅进行几次更新

  • 我将Drools与Eclipse和Maven一起用于一个进行许多模式匹配的应用程序。我想使用KieScanner自动更新正在运行的KieSession,而无需重新启动应用程序。但这似乎不起作用。 我使用的是7.24.0。t043用于组织。kie和org。流口水。 我只使用我的本地Maven存储库,所以我已经指定了路径并在我的settings.xml.中设置为true,我还验证了使用最新版本创建一个

  • 我找了很长时间,所以在标记为重复之前,请务必阅读。 我有一个函数(),它是用一个参数调用的。我想将该id作为前缀添加到每个日志消息中。每次调用函数时,它都会更改。因此,我想更新记录器模式,将此id添加为前缀。 我读过: 如何配置 如何重新配置 SO和log4j论坛上的许多帖子都在讨论如何在运行时更改配置。它们要么过时,要么根本不起作用。 以下代码基于 log4j2 文档。它打印: 如果我注释掉行然

  • 我不熟悉JTable。 我想在button press事件中在运行时更新jtable数据。 这是我的密码。 但按下“更新”按钮后不会更新。 有人能解决我的问题吗? 提前谢谢。。