2010-07-30 80 views
2

我想了解JS中的JSON,回調等。從下面的更改示例中,您將看到我正在從$ .getJSON進行函數回調。然後,我跳入getSomething()並期望它改變我的結果變量。它在功能的範圍內改變它,但不是當我跳出該功能時。在JS/JSON函數內返回變量

您將從2 console.log()中看到第一個顯示正確,第二個顯示不正確。我確定我的問題的答案與通過返回變量有關。回撥,但可以有人啓發
我:)

謝謝!

CODE:

$.getJSON('/cart.js', function (cart, textStatus) { 
    var result = ''; 
    result += 'Sample Stuff'; 
    StackOverflow.getSomething(param1, param2, function(a, b) { 
    for(j=0; j < b.length; j++) { 
     if (b.options[j] != 'Default Title') { 
     if (a.options[j].name.indexOf("Color") > -1) { 
      result += b.options[j].name; 
      console.log(result); // <-- It comes out correct (Sample Stuff + b.options...) 
     } 
     } 
    } 
    }); 
    console.log(result); // <-- It comes out incorrect, just (Sample Stuff) 
}); 

回答

0

我猜StackOverflow.getSomething()運行的AJAX請求?因此,在AJAX請求完成之前,其回調內定義的內容(循環通過ab)不會執行。會發生什麼是StackOverflow.getSomething被激發,然後console.log(result)在您的代碼結束後立即執行。到那時,StackOverflow.getSomething的回調尚未運行,並且result尚未更新。只記錄「Sample stuff」。但是,當第二個console.log在AJAX請求(getSomething)之後的回調中執行時,result已更新並「正確」記錄。

換句話說,執行順序將是這個

  1. result到「樣品東西」
  2. StackOverflow.getSomething()火災具有附接的回調函數
  3. console.log(result)日誌「樣品東西」
  4. AJAX請求
  5. ajax回調完成並觸發其回調函數。 result通過遍歷ab
  6. 回調函數的console.log(result)日誌result
+0

感謝您的解釋終值相應地更新。我想我可能已經假設了大部分,但仍然不知道如何讓getSomething()中的「結果」與getJSON()綁定,以便在getJSON()的其餘部分執行之前發生。 – 2010-07-30 20:28:40

+0

如果你依賴'result'來正確getJSON的其餘部分才能正常工作,那麼你必須將其餘的getJSON代碼放入'StackOverflow.getSomething'的回調中:) – 2010-07-30 20:33:32