2013-01-09 131 views
18

我正在使用jQuery getJSON()函数。这个功能获取数据没有问题。但有时候会等待,等待等待...并且我的加载栏显示页面中间的加载加载。 所以jQuery ajax()函数有一个超时变量。但是我想用getJSON函数。我认为我可以使用ajaxStart()ajaxStop()函数。但是如何?getJSON超时处理

$('.loadingDiv') 
    .hide() 
    .ajaxStart(function() { 
     $(this).fadeIn(); 
     setTimeout("throw '';",15000) //i used this but didn't work 
     setTimeout("return;",15000) //i used this but didn't work 
     setTimeout("abort();",15000) //i used this but didn't work.(Abort all ajax events) 
    }) 
    .ajaxStop(function() { 
     $(this).fadeOut(); 
    }); 
+0

当您将字符串'setTimeout'(你应该永远* *做),离这儿eval's他们在全球范围内。所以,你不能从它返回。 –

+0

你应该在调用'.ajax'时设置一个超时时间。 –

+0

@Asad:OP表示他希望使用'$ .getJSON'而不是'$ .ajax'。 –

回答

13

getJSON()返回一个承诺上,您可以拨打abort功能:

var p = $.getJSON(..., function(){ alert('success');}); 
setTimeout(function(){ p.abort(); }, 2000); 

编辑:但如果你的目标只是中止,如果它需要太多的时间,那么lethal-吉他的答案是更好的。

+1

+1因为它允许OP使用'.getJSON'而不是'.ajax' – renab

+0

是的,真正的答案是'使用Ajax'。但我也写过我的问题。无论如何,这个答案是有益的。谢谢。 – pheaselegen

+0

但它不会帮助这个问题,或将它? 'getJSON'的时间是等待服务器端脚本完成的时间,如果这需要时间,则中止请求,然后发送另一个将不会帮助问题 –

15

getJSON()就是以下的缩写:

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

所以,你可以使用$.ajax()并指定所需的timeout选项。另请参见:http://api.jquery.com/jQuery.getJSON/

+0

+1这可能比我的回答更有用。 –

+0

+1正是我在想什么(因此我们的答案相似,虽然你的绘图更快) – renab

+0

还有一个类似的[答案](http://stackoverflow.com/a/7613888/386579),可以被扩展为为jquery ajax调用添加超时。 –

1

setTimeout函数在全局范围内的指定数量的milisecon之后执行一组代码。

的的getJSON功能(每jQuery的文档这里http://api.jquery.com/jQuery.getJSON/)简写为:

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

所以你想使你的电话,像这样:

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

$('.loadingDiv') 
    .hide() 
    .ajaxStart(function() { 
     $(this).fadeIn(); 
    }) 
    .ajaxStop(function() { 
     $(this).fadeOut(); 
    }); 
9

至于致命吉他提到getJSON()函数只是$.ajax()的简写。如果您想要检测是否发生了超时而不是实际的错误,请使用下面的代码。

var request = $.ajax({ 
    dataType: "json", 
    url: url, 
    data: data, 
    success: function() { }, 
    timeout: 2000 
}).fail(function(xhr, status) { 
    if(status == "timeout") { 
     // do stuff in case of timeout 
    } 
}); 
+0

Typo:'=='not' =' – noahnu

+0

@noahnu谢谢。纠正。 – Bruno

3

总是有核路线,以及:

//Set AJAX timeout to 10 seconds 
$.ajaxSetup({ 
    timeout: 10*1000 
}); 

这将设置所有Ajax请求的程序,使(甚至通过$ .getJSON)有超时10秒(或什么你有没有)。

+0

我已经尝试使用1)$ .getJSON与URL和2)$ .ajax只有'url'和'dataType'属性。 $ .ajax尊重全局超时(使用本地服务器上的线程睡眠过滤器进行设置),而$ .getJSON则不会。似乎这可能是$ .getJSON中的一个错误。 – Jasman

0

我不认为这些答案是理想的。我知道这已经很晚了,但是你想要做的是在接收JSONP响应时使用.ajax();方法的成功/错误回调选项。我将如何构建这个

例子:

// Call 
    $.ajax({ 

     // URL you want to get 
     url: 'http://example.com/json?callback=?', 

     // Set a realistic time in milliseconds 
     timeout: 3000, 

     // Put in success callback function here, this example 
     // shows you the data you got back from the call 
     success: function(data) { 
     console.log(data); 
     }, 

     // Put in an error handling function, just an alert in this case 
     error: function(badData) { 
     alert('The call was unsuccessful'); 
     }, 

     type: 'POST' 
    });