我需要帮助在同步模式下调用FB.api()

I need help to make FB.api() call in Synchronous Mode

本文关键字:FB 调用 api 模式 帮助 同步      更新时间:2023-09-26

我在for循环中运行FB.api时遇到问题。

for(var i = 0; i < commentObjectLength; i++){
    var fbFeedID = commentObject.OwnCommentList[i].fbFeedID;
    var OwnCommentID = commentObject.OwnCommentList[i].OwnCommentID;
    var accessToken = commentObject.OwnCommentList[i].accessToken;
    var commentText = commentObject.OwnCommentList[i].commentText;
    alert("Hiii"); //  >>>>>>>1
    FB.api('/' + fbFeedID + '/comments', 'post', {
            message: commentText,
            access_token : accessToken
        }, function (response) {
            if (!response || response.error){
                //alert(response.error.message);
            } else {
                alert("Hello"); //  >>>>>>>2
                alert(response.id); //  >>>>>>>3
            }
        });
}

现在用简单的方式告诉大家
我期待着像
那样保持警惕1->Hiii
2->你好
3->一些响应id
4->Hiii
5->你好
6->的一些响应

但事实上,我像
一样离开了1->Hiii
2->Hiii
3->Hiii

持续到循环大小
8->你好
9->一些响应id
10->你好
11->一些响应id继续

问题是一直以来,循环的最后一个日期将转到Facebook并在推送上发表评论。不单独。

所以请任何人帮我解决这个问题。我很挣扎
(希望每个人都能理解问题,任何需要的额外信息请询问)

您需要进一步研究闭包,它将为您提供解决此问题的适当方案。

闭包为您提供了一种将所有变量值保留在其自己的函数调用中的方法,这就是为什么当FB.api返回到您的代码并做出响应时,所有局部变量在调用FB.api时都将具有相同的值。我相信这会解决你的问题。

FB.*是基于事件的,有一些技巧可以使它更同步,但它不会真正工作。您需要链接您的函数调用。

for(var i = 0; i < commentObjectLength; i++){
    var fbFeedID = commentObject.OwnCommentList[i].fbFeedID;
    var OwnCommentID = commentObject.OwnCommentList[i].OwnCommentID;
    var accessToken = commentObject.OwnCommentList[i].accessToken;
    var commentText = commentObject.OwnCommentList[i].commentText;
    FB.api('/' + fbFeedID + '/comments','post',{
            message: commentText,
            access_token : accessToken
        }, function (response) {
            alert("Hiii"); //  >>>>>>>1
            if (!response || response.error){
                //alert(response.error.message);
            } else {
                alert("Hello");//  >>>>>>>2
                alert(response.id); //  >>>>>>>3
            }
        });
}