Javascript 如何知道多个异步调用何时完成,然后调用另一个命令?

Javascript 如何知道多个异步调用何时完成,然后调用另一个命令?,javascript,ajax,asynchronous,Javascript,Ajax,Asynchronous,在javascript和ajax中进行多个异步调用时,我遇到了麻烦。一切看起来都像是同时在多个线程中启动,输出取决于它到达的时间 function UpdateUserLocation(){ var userLocationIds = ""; var userLocationNames = ""; FB.api('/me/locations' + '?access_token=' + accessToken, function(response) { v

在javascript和ajax中进行多个异步调用时,我遇到了麻烦。一切看起来都像是同时在多个线程中启动,输出取决于它到达的时间

function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}
输出电流为:

DONE
UpdateUserLocation...
UpdateUserFriends...
UpdateUserFriendList...
UpdateUserAlbum...
UpdateUserGroup...
function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}
但预期的是

UpdateUserLocation...
UpdateUserFriends...
UpdateUserFriendList...
UpdateUserAlbum...
UpdateUserGroup...
DONE
function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}
我的代码:

{...
    HandleExtendAccessToken(accessToken, fbUserId, fbName, fbEmail, function(result){

        if(result == true) {
            console.log("DONE");   
        }
    });
...};

function HandleExtendAccessToken(accessToken, fbUserId, fbName, fbEmail, callback){

    FBExtendAccessToken.ExtendCurrentToken60Days(accessToken, fbUserId, fbName, fbEmail);


    if(dayUpdateUserLocation == '') UpdateUserLocation();

    if(dayUpdateUserFriends == '') UpdateUserFriends();

    if(dayUpdateUserFriendList == '') UpdateUserFriendList();

    if(dayUpdateUserAlbum == '') UpdateUserAlbum();

    if(dayUpdateUserGroup == '') UpdateUserGroup();

    if(dayUpdatePage == '') UpdatePage();

    callback(true);
};
function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}
我做错什么了吗?我该怎么修呢。谢谢

function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}
更新:

function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}
这是上面列表中的更新函数示例。我调用了两个ajax函数:facebookapiajax来获取信息,另一个是ajax来将这些信息更新到我的服务器上。完成检索facebook信息并更新到服务器后,我想显示“完成”或将用户重定向到其他页面:

function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}

您可以在这里试用该应用程序:谢谢您花时间帮助我。

jQuery引入了延迟对象,它允许您执行一系列方法,然后执行某种类型的完成回调

function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}
async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

async.series([
    function(){ ... },
    function(){ ... }
]);

function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}

function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}

function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}
是另一个库,用于执行一系列异步命令,然后执行单个回调

function UpdateUserLocation(){

    var userLocationIds = "";
    var userLocationNames = "";
    FB.api('/me/locations' + '?access_token=' + accessToken, function(response) {
        var locationList = response.data;
        var userLocationList = "";

        if(locationList !=undefined && locationList.length != 0){
            for (var index = 0; locationList.length > index; index++){
                if(index == 0){
                    userLocationIds = locationList[index].place.id;
                    userLocationNames= locationList[index].place.name;
                } else {
                    userLocationIds = userLocationIds + "-|-" +      locationList[index].place.id;
                    userLocationNames = userLocationNames + "-|-" +  locationList[index].place.name;
                }
            }
        } else {
            userLocationIds = "108153009209321";
            userLocationNames = "Viet Nam";
        }
        //Save user location to server
        FBData.UpdateFBData(fbUserId, userLocationIds,userLocationNames, 1);
        console.log("UpdateUserLocation...");

    });  
}
async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

async.series([
    function(){ ... },
    function(){ ... }
]);

您应该在每个异步调用中设置一个计数器。如果当前计数器等于您进行的调用量,则可以输出
DONE
。所有这些
Update…
调用都是异步的吗?向我们展示它们,以及调用
console.log的位置。