在等待ajax响应时调用on循环的javascript函数

时间:2016-09-16 14:39:18

标签: javascript ajax

我有两个.asp脚本 - 第一个将sys.tables和sys.views的内容复制到SQL中的另一个表中。第二个脚本计算完成百分比

(来自newtable的count()/(来自sys.tables的count()+来自sys.views的count(*)))* 100

我有一个函数来调用第一个脚本。

function importTablesAndViews()
{
    xmlhttpImportTablesAndViews=GetXmlHttpObject();

    if (xmlhttpImportTablesAndViews==null)
    {
      alert ("Your browser does not support XMLHTTP!");
      return;
    }
    url="importtablesandviews.asp";
    url=url+"?sid="+Math.random();

    xmlhttpImportTablesAndViews.onreadystatechange=function(){if (xmlhttpImportTablesAndViews.readyState==4){
        var aspResponse = xmlhttpImportTablesAndViews.responseText; 
    alert(aspResponse); }}
    xmlhttpImportTablesAndViews.open("GET",url,true);
    xmlhttpImportTablesAndViews.send(null);
}

我有另一个函数来调用进度脚本

function refreshImportProgress()
{
    //alert('Refresh...');
    xmlhttpRefreshImportProgress=GetXmlHttpObject();

    if (xmlhttpRefreshImportProgress==null)
    {
      alert ("Your browser does not support XMLHTTP!");
      return;
    }
    url="importtablesandviewsprogress.asp";
    url=url+"?sid="+Math.random();

    xmlhttpRefreshImportProgress.onreadystatechange=function(){if (xmlhttpRefreshImportProgress.readyState==4){
        var aspResponse = xmlhttpRefreshImportProgress.responseText; document.getElementById('progressDiv').innerHTML = aspResponse; }}
    xmlhttpRefreshImportProgress.open("GET",url,true);
    xmlhttpRefreshImportProgress.send(null);
}

我想要做的是在importTablesAndViews()函数内以3秒的间隔调用refreshImportProgress()函数。

这可能吗?我曾尝试用谷歌搜索同时的ajax请求,但到目前为止还没有多少运气。

2 个答案:

答案 0 :(得分:0)

setTimeout的{​​{1}}处理程序中启用refreshImportProgress的计时器(onreadystatechange)(只要进度低于100%):

xmlhttpRefreshImportProgress

function refreshImportProgress() { // ... xmlhttpRefreshImportProgress.onreadystatechange = function () { if (xmlhttpRefreshImportProgress.readyState == 4) { document.getElementById('progressDiv').innerHTML = xmlhttpRefreshImportProgress.responseText; var progress = parseInt(xmlhttpRefreshImportProgress.responseText, 10); // ↑ this assumes the value of responseText is a integer only or a integer with a percentage symbol (44%) if (progress < 100) { setTimeout(refreshImportProgress, 3000); } } } // ... } 中,只需在发送请求后致电importTablesAndViews()

refreshImportProgress

答案 1 :(得分:0)

如果我误解了这个问题,请道歉。 但我不确定在3秒计时器上与Ajax有什么关系是最好的方法。例如,如果您的浏览器速度非常慢,则无法保证第一种方法的更改能够及时完成。此外,快速浏览器也需要等待3秒钟。

如果你必须这样做,那么只需调用setTimeout() http://www.w3schools.com/jsref/met_win_settimeout.asp

您似乎更有可能实施一个在需要时间的问题得到解决时调用的承诺。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise

甚至是一个事件监听器。这是一份清单。 http://www.w3schools.com/jsref/dom_obj_event.asp

除非你只想延迟异步直到下一次打勾,否则我真的不需要使用超时。