Использовать ajax-запрос json output в функции settimeout

У меня есть var в 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);

но он не работает

Ответ 1

setTimeout принимает функцию и число в качестве параметра, попробуйте следующее:

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

Ответ 2

Не уверен, что значение json.id изменится к моменту вызова обратного вызова таймаута.

Рассмотрим следующий пример:

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

Функция обратного вызова видит я = 10, потому что значение я к моменту запуска функции. Вы можете сделать предварительную привязку, используя закрытие:

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);

Ответ 3

Ваш код не работает, потому что String вычисляется в глобальном контексте. Поэтому для его работы вы можете сделать json global (удалить var).

Кроме того, хотя я не уверен, что вы вызываете setTimeout, но, полагая, что он находится внутри обратного вызова, вы также можете сделать идентификатор частью строки:


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

Но, конечно, лучший вариант - избегать eval и globals любой ценой (checkout Eval is evil и Почему глобальное состояние - это дьявол для подробного объяснения) и передать в закрытие:


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