在settimeout函数中使用ajax请求json输出

时间:2014-01-19 03:43:38

标签: javascript jquery ajax

在像

这样的请求之后我有一个jquery变量
         type: 'POST',
     data: data,
     cache: false,
     success: function (data) {
         var json = jQuery.parseJSON(data);

我正在尝试使用超时在五秒后触发下面的功能。

        $("#a" + json.id).fadeOut(300);

目前我正在做

          setTimeout('$("#a" + json.id).fadeOut(300)', 500);

但它似乎无法正常工作

3 个答案:

答案 0 :(得分:3)

setTimeout将函数和数字作为参数,请尝试:

setTimeout(function() {
    $("#a" + json.id).fadeOut(300);
}, 500);

答案 1 :(得分:0)

不确定json.id的值是否在调用超时回调时发生变化。

考虑以下示例:

for (var i=0;i<10;i++){
  setTimeout(function(){console.log(i)},500);
}

回调函数看到i = 10,因为这是调用函数时i的值。您可以使用闭包进行预绑定:

var f=function(id){
  setTimeout(function(){console.log(id);},500);
}

for (var i=0;i<10;i++) f(i);

既然您已经了解了封闭和预绑定的工作方式,那么这是您问题的更强大的解决方案:

var f=function(id){
  setTimeout(function(){$('#a'+id).fadeOut(300);},500);
}

f(json.id);

答案 2 :(得分:0)

您的代码不起作用,因为String在全局上下文中被评估。因此,为了使它工作,您可以使json全局(删除var)。

此外,虽然我不确定你从哪里调用setTimeout,但假设它在回调中,你可以选择将id作为字符串的一部分:


setTimeout('$("#a'+json.id+'").fadeOut(300)', 500);

但当然更好的选择是不惜一切代价避免使用eval和全局变量(checkout Eval is evilWhy global state is the devil进行精心设计的解释)并传递一个闭包:


setTimeout(function(){ $("#a" + json.id).fadeOut(300); }, 500);