【问题标题】:jQuery 'reverse callback' from ASP page来自 ASP 页面的 jQuery“反向回调”
【发布时间】:2010-02-15 15:29:03
【问题描述】:

好的,我需要向运行 ASP::PERL 的服务器发送一个大请求,并让服务器将进度回传到调用页面。基本上 -> 告诉服务器在文件共享中上传一大堆文件,然后在检查每个文件的错误/上传/成功或失败时更新客户端上的 div。

有没有办法在后端 ASP 页面中放置一些回调函数来调用加载页面上的客户端 JavaScript 函数?这必须在服务器上循环工作,因此基本上是从服务器到客户端的 pingback,因为每个文件都被上传,直到所有文件都被检查/上传。

【问题讨论】:

  • 这是一个有趣的话题。就我个人而言,我会通过让客户端轮询服务器来解决这个问题,服务器会定期更新一些状态表(或其他)。但我会看看其他人怎么说。
  • Ooo ...我想知道让最初的“POST”针对隐藏的 iframe 是否可行,然后服务器会发回一系列“脚本”块.每个脚本块都将是完整的,并且将仅包含对父页面中将更新状态的某些内容的函数调用。也许浏览器会在收到脚本标签时解析并执行它们,即使整个页面还没有完成。
  • @Pointy 我认为您可能说得对,浏览器在请求/响应周期完成之前不会解析数据。
  • 有点臭,而且你内心深处知道 ;-) 保持长时间运行的连接只是为了更新进度……好主意吗?
  • 不,我认为这根本不是一个好主意,但是有些人在互联网上运行着价值数百万美元的网站,做的事情我认为不是好主意。

标签: jquery ajax asp-classic callback


【解决方案1】:

就像上面的评论所说,(我很确定)你必须通过轮询来做到这一点。

当您将文件发送到服务器时,使用setTimeout() 函数注册一个回调函数。这个函数将“轮询”服务器,询问操作的状态(有多少文件......完成的百分比)。如果操作未完成,只需在函数完成之前重新注册相同的函数——再次使用 setTimeout()。

var callback = function() {
  // (1) Use ajax to get status from the server
  // (2) Update the progress div
  // (3) If complete, signal the user and hide the progress bar;  otherwise register callback() again
}

var submitFiles = function() {
  // Send files to server
  setTimeout(callback, 1000);
}

【讨论】:

  • 不幸的是,我不认为投票对我有用。我在客户端页面上列出了每个文件,用户想知道每个文件的状态,而不仅仅是整个事务的状态。但是我不能按传统方式发送每个文件并进行处理,因为我会在一个装满图纸的大目录上将服务器打死。破解这个问题是个难题。
【解决方案2】:

您可能会从这个post 获得一些好处。主题是批量电子邮件,但该策略将满足您的要求..

【讨论】:

  • 好的,我之前的想法和测试都失败了,让我试试这个。感谢 Sky 的代码 - 我将对其进行测试,看看它是否能解决我的问题。当然,现在我需要用 PERL 编写一个 Web 服务 - 但这是另一个问题。
【解决方案3】:

感谢大家的帮助。我想出了如何做我们需要的事情。归根结底,我们想暂停每个文件的调用,以免我们的后端服务器因一大堆文件上传调用而不堪重负。因此,我们选择了一个递归策略,它基本上进行异步调用,然后等待成功回调并处理结果 - 然后再次调用该方法。这是一些代码:

function doAjaxCall(targetCheckBox)
{
    if ((targetCheckBox) == 'undefined' || targetCheckBox == null)
    {
       targetCheckBox = $('#toprint input:checkbox[id*=ChkIn]:checked:first');

       if ($(targetCheckBox).length == 0)
       {
            alert('All Files Processed!');
            if (!CheckForm()){
                $('#checkinbtn').remove();
            } else 
            {
                $('#checkinbtn').removeAttr('disabled');
                $('#checkinbtn').val('Check In');
            }
            return;
       }
    }

    var res = $(targetCheckBox).val().split("/");
    var targetID = res[res.length-1];
    var test = document.getElementById('comment_'+targetID);
    var commentField = $(test);
    $.ajax({
        type: "POST",
        url: "loadfiles.asp", 
        data: getPostString($(targetCheckBox).val()), 
        success: function(result) {
            if (result.indexOf('Error')> -1){
                commentField.attr('style', 'background-color:#FF6267');
            } else {
                commentField.attr('style', 'background-color:#88CC55');
            }
            commentField.empty();
            commentField.html(result);
            $(targetCheckBox).remove();
            doAjaxCall(null);  // recurse on success until we don't have any more files
        }
    });
    $("#fileCounter").remove();
}

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 2019-10-21
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多