0

jquery .each関数を使用して、Facebookページのリストにメッセージを投稿するためにFacebook APIを使用しています。問題は、.each 関数がすばやく実行され、ページ ID が ajax 関数に送信されることです。そして、ajax request .each 関数の応答の前に、次のページ 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 メッセージを投稿します。キューに 3 つのページ ID があるため、Facebook API は最後のページ 3 ID に 3 つのメッセージを投稿します。

Facebook APIからのajax応答の後、各ページIDにメッセージを投稿する必要があり、.each関数は2番目のページ要求を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 に答える