2012-01-26 28 views
2

在Chrome這隻作品,而不是FF:array.push在FF中不起作用,但在Chrome中起作用......有什麼想法?

var menu = new Array(); 
    $.couch.db("foo").allDocs({ 
      success: function(d) { 
        for(var i=0;i<=d.total_rows-1;i++){ 
          menu.push(d.rows[i].id); 
        }; 
      } 
    }); 
    console.log(menu); 

我可以CONSOLE.LOG 「菜單」 裏面的功能,而不是外部。這就像它失去了它的範圍。有任何想法嗎?

+0

您的代碼看起來不錯,應該按照您的預期工作。 – ShankarSangoli

+2

是否在'console.log'底部執行'success'回調?這可能只是時間問題,因爲競賽狀況。 –

+0

javascript(html5 web workers除外)不是多線程的,所以沒有真正的競爭條件 – ori

回答

3

您的success函數稍後會被調用,一旦您收到$ .couch.db的響應,那麼當您到達console.log(menu);時,仍然會得到初始值。

+0

好的。感謝您的答覆。我想我應該想到這一點。不管在ajax調用中設置一個變量,它會在稍後調用,我認爲這有點不好。謝謝您的幫助!! – nologo

0

嘗試聲明var menu = [];而不是new Array() - 它應該沒有任何區別,但你永遠不知道。

此外,請嘗試將console.log(menu);放入循環中,然後看...哦,等等。

忘掉上面的問題,我只是重新閱讀代碼。

我很確定allDocs()是一個異步函數。您嘗試在啓動該功能後訪問結果,但尚未完成。所有依賴於menu的代碼必須位於success函數中。

0

難道是你的函數工作異步,所以,當你的console.log(菜單)功能以外它顯示菜單的原始狀態。

舉例來說,在jQuery的,當你使用AJAX功能,您可以參數「異步」設置爲,這樣的反應是正確地分配給變量。

0

問題是您正在將數據推送到回調中的菜單數組中。這意味着你的代碼執行在某種程度上是這樣的:

  1. 新陣列創建
  2. $ .couch.db()被調用它做一些事情(有些異步任務,這將導致執行流程繼續)
  3. 的console.log()被調用通常打印空數組,因爲菜單爲空
  4. $ .couch.db()做完這件事的業務,並叫你的「成功」回調填補你的陣列

但是, re可以是你的回調在到達console.log()之前執行的,所以你真的在這裏處理競爭條件。

相關問題