2013-08-29 50 views
0

我正在使用Facebook API發佈消息在使用jquery .each函數的Facebook頁面列表上。問題是。每個函數都會很快運行並將頁面ID發送到我的ajax函數。並且在ajax請求的響應之前,每個函數都會將下一個頁面id發送到ajax函數,並在最後一個頁面id的隊列中結束facebook api發佈消息。並且發佈消息的數量是隊列中的頁面ID的長度。 例如我在jQuery。每個函數運行結束和顯示後面的ajax響應

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

jQuery的3頁ID。每個功能將所有的pageID阿賈克斯功能和Facebook API後3消息,去年第3頁ID。因爲我在隊列中有三個頁面id,因此facebook api在最後一頁3上發佈了三條消息。

我需要在每個頁面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.') 
       } 
      }) 
     } 
    }) 
} 

回答

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> 
    } 
} 

在從阿賈克斯你的反應叫你能做到這一點

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(); 
      } 
     }) 
    } 
}) 

這將確保你的代碼不會嘗試發送另一個請求,直到第一個完成。當您的對象數組爲空時,它將停止。

+0

owsum解決方案。這就是我需要的。謝謝 –