2011-04-20 34 views
0

請原諒尷尬的標題我會盡我所能解釋我的特殊問題。(js)引起代碼工作的Firebug調試

我有JavaScript代碼的三位:

  • 一些自執行代碼,調用我個人的Ajax功能,並將其傳遞一個回調。
  • 檢索數據的ajax函數本身會調用傳遞數據的回調函數。
  • 回調本身,它接收數據並將其解析爲長度爲的數組。

需要注意的是自執行代碼和回調函數是在它們自己的閉包中定義的。 ajax函數通過導入的命名閉包進行訪問,我定義爲$

我對JavaScript很新,我仍然在學習關閉和範圍。我有理由相信這個問題可能與此有關。

無論如何,我的問題涉及到試圖訪問那個被認爲是人口稠密的數組。因爲我將數組定義在合適的範圍內(或者我相信)作爲解析函數,所以我認爲我應該沒有問題將項目插入它。

這是自exectuting:

(function ($){ 

    //Load stock 
var items = []; 
var response = $.Ajax("scripts/Lookup.php","GET",parse); 

function parse(a){ 
    for(/*Simplified view*/){ 
     var item = new $.Item(); 
     item.name = domStuff.textContent; 
     item.description = domStuff.textContent; 
     item.price = domStuff.textContent; 
     item.id = domStuff.textContent; 

     items.push(item); 
    } 
} 

    //Test the length (and verify contents) 
    for(var i=0; i < items.length; i++){ 
     alert(items[i].price); 
    } 
}($)); 

這是我的定義,其中包括Ajax的功能:

var $ = (function(){ 
var s = {}; 

    var ajax = function(url,method,callback){ 
     var a = new XMLHttpRequest(); 
     a.open(method, url, true); 
     a.onreadystatechange = function(){ 
     if(this.readyState==4){ 
       callback(a); 
      } 
    } 
    a.send(); 
    }; 

    s.Ajax = (function(){ 
     return ajax; 
    }()); 

return s; 
}()); 

那麼證明標題是,當我探頭代碼螢火蟲,我可以看到項目填充了3個由解析數據正確定義的對象。

循環然後按預期發出3次警報。

但是,如果我刪除中斷點,並有螢火蟲忽略代碼,然後循環不會播放,我只能假設數組是空的。

如果我在測試循環之前提醒(項目),代碼也有效。

+0

我在哪裏可以找到這個特殊版本的Firebug? – KooiInc 2011-04-20 17:01:29

+0

如果看起來像代碼同步問題。使用Firebug Alert時發生的唯一變量是延遲。看起來延遲會讓您的一些代碼的呼吸時間完成。 (我還沒有完全分析過你的代碼,但這是我第一件事)。 – 2011-04-20 17:03:58

回答

2

AJAX是填充項目asynchronously,意思就是在你的關閉中,對於第一次執行items.length將是零(從原始數組初始化)。隨着時間的推移,通過調用parse方法的AJAX將填充這個數組。

因爲你將items保留在閉包中,所以你實際上不能從外部訪問它 - 這是一個很好的做法,但可能會導致調試問題!而不是items.push(item)嘗試alert(item)(任何瀏覽器,但執行阻止)或console.log(item)(只有螢火蟲)看到你,確實,從AJAX獲得的結果,而不是在初始執行。

+0

這就是我在我的答案中也想說的。您的代碼需要等待異步代碼完成。 – geoffrobinson 2011-04-20 17:07:20

+0

謝謝,問題是關於異步性。 – Aaron 2011-04-20 18:23:15

1

我不是一個JavaScript專家。但是,我遇到了其他編程語言的情況,這些語言的調試已經解決了一個問題。

在這些情況下,調試已經放慢了代碼的運行速度。某些進程A需要異步進程B才能返回對象或在執行某個點之前執行某些操作。在這些類型的場景中最有可能發生的情況是主線程正在繼續或不等待對象被其他例程填充。

我希望有幫助。

+0

感謝您的回覆 – Aaron 2011-04-20 18:24:49

1

你的解析函數是異步調用的。在測試之前,您需要等待解析函數被調用。

要麼測試結果在你解析函數或有另一個函數作爲ajax調用的回調。這個函數調用解析然後測試結果。

+0

感謝您的回覆 – Aaron 2011-04-20 18:24:21