来自ASP页面的jQuery'反向回调'

时间:2010-02-15 15:29:03

标签: jquery ajax asp-classic callback

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

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

3 个答案:

答案 0 :(得分:2)

就像上面的评论所说的那样(我很确定)你必须通过民意测验来做到这一点。

将文件发送到服务器时,使用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);
}

答案 1 :(得分:0)

你可能会从这个post获得一些里程数。主题是批量电子邮件,但该策略适用于您的要求..

答案 2 :(得分:0)

感谢所有帮助人员。我想出了如何做我们需要的事情。它归结为我们想要对每个文件的调用进行停顿,这样我们就不会用一大堆文件上传调用来压倒我们的后端服务器。因此,我们选择了一个基本上进行异步调用的recursoin策略,然后等待成功回调并处理结果 - 然后再次调用该方法。这是一些代码:

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();
}