0

我正在使用 facebook api 使用 jquery .each 函数在 facebook 页面列表上发布消息。问题是 .each 函数运行很快,并将页面 ID 发送到我的 ajax 函数。在 ajax 请求响应之前,每个函数将下一页 id 发送到 ajax 函数,最后 facebook api 在队列中的最后一页 id 上发布消息。并且发布消息的数量是队列中页面ID的长度。对于前。我有 3 个页面 ID

<select>
<option>page1 id|AccessToken></option>
<option>page2 id|AccessToken></option>
<option>page3 id|AccessToken></option>
</select>

Jquery .each 函数将所有 pageID 发送到 ajax 函数和 facebook api 在最后一个 page3 id 上发布 3 消息。因为我在队列中有三个页面 ID,因此 facebook api 在最后一个 page3 id 上发布了三条消息。

我需要在每个页面 ID 上发布消息,在来自 facebook api 的 ajax 响应之后,然后 .each 函数将第二页请求发送到 facebook api 等等。

我使用了以下代码。

Java 脚本代码

function submitPost()}{
  $('#users input:checkbox').each(function () {
        var a = (this.checked ? $(this).val() : "");        
        if (a != ""){    
          postToPage(a)    // a = PageId|AccessToken <option>PageId|AccessToken</option>
        } 
  });
}
function postToPage(c) {
    dataSeprator = c.split("|");
    d = dataSeprator[0];
    my_message = $('#txtmsg').val();
    url = $('#txturl').val();
    title = $('#txttitle').val();
    desc = $('#txtdesc').val();
    picUrl = 'facebook.png';
    FB.api('/' + d, { fields: 'access_token'}, function (b) {
        if (dataSeprator[1].length > 0) {
            FB.api('/' + d + '/feed', 'post', {
                message: my_message,
                link: url,
                name: title,
                picture: picUrl,
                description: desc,
                access_token: dataSeprator[1]
            }, function (a) {
                if (!a || a.error) {
                    alert('Error occured')
                } else {
                    alert('Message Posted Successfully.')
                }
            })
        }
    })
}
4

1 回答 1

1

正如您在此处所做的那样,等待异步调用旨在不阻塞您正在运行的任何其他代码。因此,无论响应如何,每个循环都会循环。所以你的解决方案是不同的模式。

首先将您的 jQuery 对象保存在一个数组中

var user_checkboxes = [];
user_checkboxes = $('#users input:checkbox');

然后只提交索引 0 的用户。

function submitPost(){
    if(user_checkboxes.length === 0) return;
    var user = user_checkboxes[0];
    var a = (user.is(':checked')) ? user.val() : "");        
    if (a != ""){    
      postToPage(a)    // a = PageId|AccessToken <option>PageId|AccessToken</option>
    }
}

在您对 Ajax 调用的响应中,您可以执行此操作

FB.api('/' + d, { fields: 'access_token'}, function (b) {
    if (dataSeprator[1].length > 0) {
        FB.api('/' + d + '/feed', 'post', {
            message: my_message,
            link: url,
            name: title,
            picture: picUrl,
            description: desc,
            access_token: dataSeprator[1]
        }, function (a) {
            if (!a || a.error) {
                alert('Error occured')
            } else {
                //success

                //remove from array
                user_checkboxes.splice(0,1);

                //submit the next one, now at 0
                submitPost();
            }
        })
    }
})

这将确保您的代码在第一个请求完成之前不会尝试发送另一个请求。当您的对象数组为空时,它将停止。

于 2013-08-29T10:14:55.070 回答