0

我有以下情况。我想从服务器加载文件A,然后(取决于A的内容)将尝试加载文件A1,A2,A3,...... An,每个文件A[1-n]将依次加载其他文件,这可以继续进行。是的,它已经结束了。

不幸的是,我开始意识到我需要使用 synchronized $.ajax requests,否则第一个 $.ajax 调用(当完成加载文件 A 时)只会返回而不会遍历其余文件。我的功能如下:

loadFile = function (path, file, scope)
{
    $.ajax ({
        url: url,
        type: 'GET',
        dataType: 'text',
        success: function (responseData)
        {
            var lines = responseData.split("\n");
            for (var j = 0; j < lines.length; j++)
            {
                if (lines[j].charAt(0) === 'F')
                    loadFile (arguments);
            }
        }
    });
}

我的第一个问题是为什么我不能在上述选项中添加“async:false”,而是必须使用$.ajaxSetup({async: false});,否则它不起作用。

我的第二个问题是这是用于递归完成这项工作的正确模式。

我的第三个问题是我如何知道整个过程何时完成。我想不通。

4

1 回答 1

1

async: false是万恶之源。它会阻止您的整个选项卡,并且在某些情况下(例如旧版 IE)会阻止整个浏览器。不要使用它。

现在解决您的问题。你可以这样做:

// note new argument "callback"
var loadFiles = function(path, file, scope, callback) {
    var req = $.ajax({
        // some settings
        success: function(res) {
            // some processing
            for (var j = 0; j < lines.length; j++) {
                loadFiles.requests.push(
                    // the same callback
                    loadFiles(path2, file2, scope2, callback)
                );
            }

            // set this request to complete
            req.completed = true;

            // check if all requests are done
            for (var i = 0; i < loadFiles.requests.length; i++) {
                if (!loadFiles.requests[i].completed) {
                    return;
                }
            }
            // TODO: you could remove completed requests from that array
            // to increase performance

            // if all are done then reset the array and run the callback
            delete loadFiles.requests;
            if (callback) {
                callback();
            }
        }
    });
    if (!loadFiles.requests || !loadFiles.requests.length) {
        loadFiles.requests = [req];
    }
    return req;
};

loadFiles(path, file, scope, function() {
    // this happens after all is done
});

请注意,连续两次调用此函数会破坏它(因为loadFiles.requests是全局函数的属性)。为了支持这一点,您必须将所有内容包装在外部函数中并使用该函数。

于 2013-03-23T13:08:45.140 回答