2013-03-07 98 views
2

我有下面這段代碼,它應該返回調用的結果。我需要同步做到這一點,以便我知道一切都很好,但它似乎並不奏效。我究竟做錯了什麼?getJSON不尊重異步:false

/* jQuery library: 
* http://code.jquery.com/jquery-1.9.1.min.js 
*/ 
function getJSON(url){ 
    var result; 
    $.getJSON(url, { async: false, success: function(data) { 
     result = data; 
     alert(data); // **Edit**: also undefined 
    }}); 
    alert(result); // undefined 
    return result; 
} 
+0

jsonp?這是我正在使用的代碼。 – 2013-03-07 22:17:01

+0

你介意告訴我們你的網址是(或者類似的)嗎? – 2013-03-07 22:17:05

+1

getJSON的數據參數用於向服務器發送數據,不設置參數。即使如此,你用錯了。你爲什麼想讓它成爲'async:false'?除非你在webworker中,否則這是一個糟糕的主意。 – 2013-03-07 22:17:42

回答

11

的getJSON不接受異步:假

getJSON沒有async: false選項。你必須使用ajax

根據該文件,getJSON相當於:

$.ajax({ 
    dataType: "json", 
    url: url, 
    data: data, 
    success: success 
}); 

...到您可以輕鬆地添加async: false選項(現在,諒解,jQuery將下探該支撐位)。

我需要讓我知道一切都很好做這個同步

你不需要做任何事情同步「知道一切都很好」,這是完全可能的(正常)至異步處理結果(無論是「好」還是錯誤)。


在對你的問題的評論,你寫的:

JSONP?這是我正在使用的代碼。

JSON-P不如JSON(和getJSON沒有做JSON-P,除非你有callback=?或URL類似)相同,JSON-P是固有異步的。與通過XMLHttpRequest進行真正的ajax調用不同,不可能使JSON-P同步。

+0

這不太對。 '.getJSON()'在內部使用'.ajax()'。 – jfriend00 2013-03-07 22:21:17

+0

@ jfriend00:哪部分是不對的? 'getJSON'沒有'async:false'選項。如果你想使用這個選項,你必須直接調用'ajax'。 – 2013-03-07 22:22:03

+0

不正確的部分是你也不能通過使用'$ .ajax()'來解決問題。你不能用'$ .ajax()'來跨域JSON請求。所以你推薦使用'.ajax()'是不對的。 – jfriend00 2013-03-07 22:23:33

2

$.getJSON()不支持async: false,也沒有辦法,甚至傳遞選項$.getJSON()(看在jQuery doc參數)。

內部,$.getJSON()使用$.ajax(),如果你看一下doc page$.ajax(),它會告訴你在那裏,如果AJAX請求是跨域,它是爲JSONP,它不支持async: false

原因是跨域JSON請求是用JSONP實現的,JSONP根據定義是一個動態插入的<script>標記,它只能是異步的。它不能同步。

如果您的請求是跨域的,您將需要將您的請求編碼爲異步,或者如果它不是跨域,則需要直接使用$.ajax()

0

$.getJSON$.ajax的簡寫。

這是一個簡寫的Ajax功能,這相當於:

$阿賈克斯({ 數據類型: 「JSON」, 網址:網址, 數據:數據, 成功:成功 } );

您會注意到沒有選項可以通過異步選項。您試圖添加async: false的參數實際上是將通過ajax請求發送到url的數據。

嘗試這樣做,而不是:

$.ajax({ 
    dataType: "json", 
    url: url, 
    async: false, 
    data: data, 
    success: success 
}); 

此外,您的發言

我需要讓我知道一切都很好

是不正確的做到這一點同步。您可以從異步回調中「知道一切都很好」。示例代碼會做你正在嘗試做上面那樣,如果你寫的是這樣的:

function getJSON(url){ 
    var result; 
    $.getJSON(url, function(data) { 
     alert(data); 
     // do other stuff with data, call other methods etc. etc. 
    }); 
} 

你甚至可以單獨定義您的回調函數,並將它傳遞給$.getJSON,像這樣:

function jsonCallback(data) { 
    alert(data); 
    // do other stuff with data, call other methods etc. etc. 
} 
function getJSON(url){ 
    var result; 
    $.getJSON(url, jsonCallback); 
} 
+0

「...上面的確如果你這樣寫:」但是什麼時候結果會被設置並返回? – 2013-03-07 22:25:27

+0

您無需設置或返回以使用它。無論你想用它做什麼,只需在回調中完成。如果你想緩存或保持它,你可以通過執行'window.lastJsonResult = data;'將它存儲在窗口上(全局),但它的工作方式和異步一樣。你堅持認爲它是同步的唯一的事情是整個系統在你等待時鎖定,大多數人會認爲這是一個缺點,而不是一個加號。 – 2013-03-07 22:30:00