等待循环结束并执行第二个函数

Wait for loop ending end execute second func

本文关键字:第二个 函数 执行 循环 结束 等待      更新时间:2023-09-26

我有两个函数:

function parseFriends_new(range) {
var xml = window.XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP");
        var params = "gwt.requested=" + gwtHash + "&refId=search-d-" + Date.now() + "&d.sq=&d.o=" + range + "&d.d=d.in";
        xml.open("POST", "/dk?cmd=FriendsSearch", true);
        xml.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xml.setRequestHeader('TKN', TKN);
        xml.onreadystatechange = function() {
            if (4 == xml.readyState && 200 == xml.status) {
            }
        }
        xml.send(params);
}
function postNoteAndTag(friendsList, repostId, trashText) {...}

我需要在parseFriends_new 之后执行postNoteAndTag

for (var i = 0, range = 0; i < 20; i++, range += 10)
{
    parseFriends_new(range);
}
//wait for loop and then execute next code
postNoteAndTag(friendsList, repostId, trashText);

如何做到这一点?

由于parseFriends_new是异步的,您可能需要对其进行修改,使其与回调一起工作:

function parseFriends_new(range, done) {
    var xml = window.XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP");
    var params = "gwt.requested=" + gwtHash + "&refId=search-d-" + Date.now() + "&d.sq=&d.o=" + range + "&d.d=d.in";
    xml.open("POST", "/dk?cmd=FriendsSearch", true);
    xml.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xml.setRequestHeader('TKN', TKN);
    xml.onreadystatechange = function() {
        if (4 == xml.readyState && 200 == xml.status) {
        }
        // The AJAX request finished => we can invoke the callback.
        // you could also pass it some result if needed
        done();
    }
    xml.send(params);
}

然后:

// We've got 20 AJAX requests to make at total
var count = 20;
for (var i = 0, range = 0; i < count; i++, range += 10) {
    parseFriends_new(range, function() {
        --count;
        if (count <= 0) {
            // All AJAX requests have finished executing
            // you can now do whatever you intended to do:
            postNoteAndTag(friendsList, repostId, trashText);
        }
    });
}

不过,请记住,这是一种绝对不好的做法,在一个突发事件中用这么多请求来打击你的网络服务器。这对服务器、客户端和TCP/IP都不好。

一个更好的解决方案是向服务器发送一个带有所有有效负载的AJAX请求。发送一个大型AJAX请求比发送多个小型AJAX请求效率高得多。当然,您可能需要调整服务器端脚本,以便能够处理请求。