2013-08-20 82 views
2

如何在此延遲函數中使用myValue以便定義myQuery?傳遞變量以推遲JSON函數?

$.getJSON('lorem.json', function (data) { 

    var myKey = $("input").val(); 
    var myValue = data[myKey]; 

}).then(function() { 

    var myQuery = "http://example.com?q=" + myValue ; 

    $.getJSON(myQuery, function (info) { 
     console.log(info); 
... 
+1

嘗試全球IT,而不是'無功myvalue的數據= [的myKey]'用'window.myValue =數據[的myKey]'然後用它與你'myQuery'像'VAR更改爲MyQuery = 「http://example.com?q=」 + window.myValue;' – MaveRick

+2

你就不能使用一個回調函數?爲什麼你需要將功能分成兩部分? –

+0

@MaveRick全局變量是矯枉過正,如果在另一個腳本文件中的一些時候你要使用相同的全局變量用於不同的目的,只會導致問題。您可以將'myValue'移動到'$ .getJSON' *調用*的包含範圍內,這將使這兩個回調函數都可以訪問它。如果包含範圍不是全局範圍,而是另一個函數範圍,則它不會污染全局範圍,也不會導致命名衝突。無論哪種方式,看起來好像OP想要做更簡單的事情,爲此可能有一個更簡單的解決方案。 –

回答

3

您可以使用父上下文

var myValue = null; 
$.getJSON('lorem.json', function (data) { 

    var myKey = $("input").val(); 
    myValue = data[myKey]; 

}).then(function() { 

    var myQuery = "http://example.com?q=" + myValue ; 

    $.getJSON(myQuery, function (info) { 
     console.log(info); 
+0

製造全局並不是一個好習慣。用函數包裝它,但這種方法有一個缺點。例如,如果您創建的實用程序函數返回從data - > info發送的延遲,則無法訪問該變量而不使其全部可用。延期後,您可以隨身攜帶這些信息,並輕鬆將回調信息傳遞給您在步驟中獲取的任何信息。 – jcbelanger

+0

但是代碼不會生成var全局變量,只能使用父上下文創建var變量。每個功能將創建一個自我上下文,共享一個數據,只有在父上下文中才有可能。 –