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

显示Ajax调用进度的最佳方法是什么?

卫彭亮
2023-03-14
问题内容

我有一个Ajax调用,它可以更新数据库中的5,000条记录,因此需要很多时间。我有一个Ajax“正在加载图像”,它表明正在发生某些事情,但是我正在寻找一种更好的方式来显示“正在更新5000中的50
.....”,“正在更新5000中的200”或类似的东西。

在Ajax / jQuery中不做5000篇不同文章的最佳方法是什么?


问题答案:

我认为最好是使用Comet。

在Comet样式的应用程序中,服务器实际上可以将数据推送到客户端(而不是客户端一次又一次从服务器请求数据)。客户端只需连接 一次 服务器 即可
。然后服务器将继续将数据推回客户端。

从维基百科:

Comet是一种编程技术,可使Web服务器将数据发送到客户端,而无需客户端请求。它允许创建事件驱动的Web应用程序,该应用程序托管在浏览器中。

现在让我们看看Comet的工作原理。请参阅以下服务器端代码。这里使用了一个while循环,您可以设置自己的条件。在while循环中,页面写入日期时间并刷新,然后睡眠1/2秒。

ASP.NET页面的代码隐藏:Service.aspx.cs

public static string Delimiter = "|";

protected void Page_Load(object sender, EventArgs e)
{
    Response.Buffer = false;

    while (true)
    {
        Response.Write(Delimiter
            + DateTime.Now.ToString("HH:mm:ss.FFF"));
        Response.Flush();

        // Suspend the thread for 1/2 a second
        System.Threading.Thread.Sleep(500);
    }

    // Yes I know we'll never get here,
    // it's just hard not to include it!
    Response.End();
}

客户端代码-纯JavaScript

只有做出一次请求,然后守在检查数据readyState === 3XMLHttpRequest

function getData()
{
    loadXMLDoc("Service.aspx");
}

var req = false;
function createRequest() {
    req = new XMLHttpRequest(); // http://msdn.microsoft.com/en-us/library/ms535874%28v=vs.85%29.aspx
}

function loadXMLDoc(url) {
    try {
        if (req) { req.abort(); req = false; }

        createRequest();

        if (req) {
            req.onreadystatechange = processReqChange;
            req.open("GET", url, true);
            req.send("");
        }
        else { alert('unable to create request'); }
    }
    catch (e) { alert(e.message); }
}

function processReqChange() {
    if (req.readyState == 3) {
        try {
            ProcessInput(req.responseText);

            // At some (artibrary) length   recycle the connection
            if (req.responseText.length > 3000) { lastDelimiterPosition = -1; getData(); }
        }
        catch (e) { alert(e.message); }
    }
}

var lastDelimiterPosition = -1;
function ProcessInput(input) {
    // Make a copy of the input
    var text = input;

    // Search for the last instance of the delimiter
    var nextDelimiter = text.indexOf('|', lastDelimiterPosition + 1);
    if (nextDelimiter != -1) {

        // Pull out the latest message
        var timeStamp = text.substring(nextDelimiter + 1);
        if (timeStamp.length > 0) {
            lastDelimiterPosition = nextDelimiter;
            document.getElementById('outputZone').innerHTML = timeStamp;
        }
    }
}

window.onload = function () { getData(); };

参考



 类似资料:
  • 问题内容: 我有mongodb和NodeJs。通过mongoosejs完成连接。 开发Ajax Infinity滚动的最佳方法是什么?我应该使用极限和偏移量吗? 问题答案: 当您对数据集进行分页时,“跳过并限制”方法不是很有效。它实际上是Shlemiel Painter的算法 。 范围查询效率更高(当索引支持时)。例如,假设您正在显示推文。您的页面大小是20,您在第1000页上,并且想要加载第10

  • 问题内容: 我正在阅读这篇文章:http : //eviltrout.com/2013/06/15/ember-vs- angular.html 它说, 由于缺乏约定,我想知道有多少Angular项目依赖于不良行为,例如直接在控制器内进行AJAX调用?由于依赖注入,开发人员是否将路由器参数注入指令中?AngularJS新手开发人员是否会以经验丰富的AngularJS开发人员认为惯用的方式来构造代码

  • 我一直在构建一个小型银行应用程序,遇到一个问题,交易的localDateTime显示为完整格式“2020-10-06T11:54:00.517734”。 这显然不太好看,所以我尝试了几种不同的格式化方法,但大多数都以空指针异常结束。 在这里,数据会从数据库添加到模型中: 这是HMTL页面: 我应该尝试在HTML文件中制作这些格式吗?还是有更好的方法在Java中做到这一点?

  • 问题内容: 我有一个使用XML响应请求的服务器,我想在javascript中解析它。我真的很喜欢ActionScript XML解析器,它对我来说很容易使用。我在徘徊是否有一种非常简单/直接的方法来解析我从服务器获取的XML? 理想的用法应该是: fetchXML新的XMLParser。parser.parse访问文档。 顺便说一句,我计划使用jQuery。 问题答案: 一个普通的with 会解决

  • 我需要根据一些配置数据启动多个独立的周期性任务——总数事先不知道。例如,我想检查具有不同间隔和不同参数的不同目录的内容,其中列表和参数是从配置中读取的。 在我看来,夸克斯调度器只能调度固定的、预先已知的方法。动态/编程调度的最佳方法是什么?<代码>vertx.set周期 是正确的方法还是我应该以某种方式访问Quartz?

  • 我遇到了一个问题。我的网页有一个控件。值更改后(通过选择不同的值),页面将刷新并呈现内容。 下面是我的代码: 第二部分: