2011-05-11 37 views
1

我試圖編寫一個腳本,該腳本1)從文本輸入字段中讀取FB用戶ID &將它們循環到數組中2)調用FB.api與每個名字的ID並將返回的名字值保存到另一個數組中。 問題:由於某種原因,從FB.api收到的所有名字保存到相同的數組索引的地方5.這是多餘的,因爲怪異的循環應該只從索引1到4保存FB.api調用對使用Javascript的for循環的數組的響應

<script type="text/javascript"> 
var ids = new Array(); 
var names = new Array(); 
var fields = 4; 


function firstNames() { 

var i; 
var k; 


for (i=1;i<=fields;i++) 
    { 
     ids[i] = document.getElementById("field"+i).value; 
    } 

for (k=1; k<=fields; k++) 
    { 
     FB.api('/'+ids[k], function(response) { 
      names[k] = response.first_name; 
      alert(k+' test '+names[k]); 
     }); 
    } 

} 
</script> 

有任何人遇到類似的事情?任何幫助將非常感激。

預先感謝。

回答

0

它不是一樣的Api調用,但我實際上遇到了類似的東西。

你必須明白facebook api調用是異步的。最重要的是,它很慢。所以JavaScript的速度更快,到第一個響應發送時,您的javascript for循環已經完成。這就是爲什麼一切都發送到k = 5,這是循環後的k值。

發生這種情況是因爲JavaScript不會強制您在處理程序中使用最終變量,就像java一樣。

所以,現在你明白,如何解決它?對不起,當我遇到這種問題時,我提出了一個骯髒的解決方案。

我所做的是直接在函數(響應)體中處理代碼,而不是使用中間變量。所以作爲一個快速修復,你可以做同樣的事情,忘記你的名字數組,或者找到更好的東西。

+0

啊哈,我害怕它會是這樣的事情。我想我現在不得不以醜陋的方式嘗試稍後復活。感謝您的幫助Joel! :) – Lasba 2011-05-12 20:59:56

+0

我不認爲異步API調用是關於「k」值爲「5」的問題......請閱讀Mikado Takada的評論:「技術根源是範圍解析/評估策略」 - http://blog.mixu.net/2011/02/03/javascript-node-js-and-for-loops/#comment-7980 – 2011-06-01 02:46:01

2

閱讀:的Javascript,node.js中和循環
參見:實驗#7:關閉新建立的範圍的新變量
網址:http://blog.mixu.net/2011/02/03/javascript-node-js-and-for-loops

我有同樣的問題因爲你即FB.api得到FOR循環最終迭代索引...

請試試這個解決方案:

for (k=1; k<=fields; k++) 
{ 
    // Closure with new scope establishing a new variable 
    (function() { 
    var index = k; // new variable 
    FB.api('/'+ids[index], function(response) { 
     names[index] = response.first_name; 
     alert(index+' test '+names[index]); 
    }); 
    }(); 
} 

更新:有一點需要注意的是,在這個例子中,警報可能不會按順序發生,即你可能會得到1,4,2,3 ......這一切都取決於每個API的網絡延遲呼籲他們在執行的訂單...