2013-03-07 97 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