2015-09-04 313 views
0

使用以下jQuery,爲什麼我不能在$.getJSON()函數之外使用json var?如果我把console.log()放在$ .getJSON回調函數中,它可以工作,但爲什麼不在外面?爲什麼我無法在控制檯中看到這個JSON?

function getMyJson() { 
    var json; 
    $.getJSON('/cdnBuffet.json', function (data) { 
     json = data; 
    }); 

    console.log(json); // nothing is shown in console here. Why? 
} 
+2

這是一個異步調用,執行'的console.log(JSON)'(函數(){})'函數[API的getJSON(HTTP:// API .jquery.com/jquery.getjson /) – SerCrAsH

+2

您的getJson函數是異步的。這意味着它會在你的getJson之前得到你的console.log的答案。 – klauskpm

回答

2

JavaScript通常用作回調函數的異步函數 - 嘗試強制執行同步函數通常是一個初學者的錯誤,讓人後悔。

您的ajax調用通常是這樣的異步調用,您指定的function是在ajax調用完成時執行的回調。

在您的代碼中,console.log在ajax調用完成之前執行。

只是移動的console.log回調裏面是這樣的:

function getMyJson() { 
    var json; 
    $.getJSON('/cdnBuffet.json', function (data) { 
     json = data; 
     console.log(json); // will now show the data... 
    }); 
} 

如果你確實需要將其返回到調用函數getMyJson,只是擴展的編程領域getMyJson有回調爲好,像:

function getMyJson(myCallback) { 
    var json; 
    $.getJSON('/cdnBuffet.json', function (data) { 
     json = data; 
     console.log(json); 
     myCallback(json); // this will return the data to the callback 
          // specified by the use of the function 
    }); 
} 
-2

那麼你可以省略默認.getJSON

呼叫.ajaxSetup

$.ajaxSetup({ 
    async: false 
}); 

的異步利益或修改到的getJSON中,阿賈克斯的更長的版本和異步設置爲false

$.ajax({ 
    url: URL, 
    dataType: 'json', 
    async: false, 
    data: stuff, 
    success: function(data) { 
    } 
}); 
0

當行console.log(json);執行時,您的回調函數在那個人口中,它還沒有被解僱。但是,如果之後在控制檯中輸入相同的行,則應該看到它有一些數據(假設$.getJSON確實返回了json)。

-2

原因數據不打印出來是因爲$.getJSON(...)呼叫是異步的,這意味着它在後臺執行,並且不阻塞(等待),直到它米之前完成接下來的陳述(印刷)。這意味着,當您嘗試打印數據時,該數據仍在後臺檢索。

在後臺執行HTTP請求有很多好處,但最常見的做法是,您的應用程序不會在請求完成時暫停並顯示爲凍結。

在任何情況下,如果您確實必須編寫功能樣式的代碼,那麼您始終可以通過在開始時配置您的ajax請求來實現異步調用。你可以這樣做:在`.done

$.ajaxSetup({ async: false }); 
相關問題