0

我已经阅读了无数类似帖子的请求帮助示例以及回调背后理论的解释,但我就是无法理解。我已经到了我宁愿为我的特定场景找到解决方案并继续前进的阶段,即使我并不真正理解它的“为什么/如何”工作。我有一个需要循环的 ajax 调用,并且需要找到一种方法来防止在前一个调用完成之前进行下一个调用。您能否建议我如何使用回调或其他方法来实现这一点。

这是代码(有效,但不运行 ajax 调用 1-by-1 所以我遇到内存错误和页面崩溃)。运行的功能非常密集,最多可能需要 20 秒(但只需 1 秒)

function returnAjax(startLoc,startRow)
{
        var url='index.php?option=com_productfinderrtw&format=raw&task=goThroughProcess';
        var data = 'startloc='+startLoc+'&starttour='+startRow;
                            var request = new Request({
                            url: url,
                            method:'get',
                            data: data,
                            onSuccess: function(responseText){
    document.getElementById('fields-container').innerHTML= responseText;  
//I realise this is where on-success code cneeds to go- is this where the callback belongs? 
                            }
                            }).send();

}

function iterator (startLoc,startRow) {
    if (startRow <20)
        {
        startRow++;
        }
        else
        {
        startRow = 1;
        startLoc++;
        }
    return [startLoc, startRow];
}


function runRAA() {
    var startLoc = 0;
    var startRow = 1;

    while (startLoc < 47)
    {
    returnAjax(startLoc,startRow);
    $counter = iterator(startLoc,startRow);
        var newLoc = $counter[0];
        var newRow = $counter[1];

        startLoc = newLoc;
        startRow = newRow;
    }
}

runRAA()是在按钮按下时运行的主要功能。如何重新安排它以确保 returnAjax 在上一次完成之前不会运行?

在此先感谢您。我知道有人问过类似的问题,所以我请求您不要将我引向其他解释——我可能已经阅读过它们,但只是不理解这个概念。

干杯!

PS。我了解 iterator() 函数仅在 returnAjax() 完成时才需要运行,因为 iterator() 为 returnAjax() 函数的每个实例设置新参数值

4

1 回答 1

0

允许传递callback将在 ajax 调用完成时调用的参数。

function returnAjax(startLoc, startRow, callback) {
    //...
    onSuccess: function(responseText) {
        document.getElementById('fields-container').innerHTML= responseText;
        if (callback) {
            callback.apply(this, arguments); //call the callback
        }
    }
    //...
}

然后你可以做这样的事情:

 function runRAA(startLoc, startRow) {
        startLoc =  startLoc || 0;
        startRow = startRow || 1;

        if (startLoc < 47) {
            returnAjax(startLoc, startRow, function (responseText) {
                var counter = iterator(startLoc, startRow);

                //do something with the response

                //perform the next ajax request
                runRAA(counter[0], counter[1]);

            }));
        }
    }

    runRAA(); //start the process
于 2013-04-20T19:15:20.660 回答