内部循环中的jquery超时无法正常工作

时间:2016-12-07 21:36:23

标签: javascript jquery ajax

我有一个包含序列化对象列表的json。我想走这个json并每2秒向它显示一条消息,然后停止。 我是这样做的:

$.ajax({
      type: 'GET',
      url: basename+'/getUnprocessedList/123',
      dataType: 'jsonp',
      success: function (data) {
        for(var i=0, keys=Object.keys(data), l=keys.length; i<l; i++) {
            console.log('hit '+i);
            setInterval(processMessage(data[i]),2000);
             }}
});

但是没有任何工作,setInterval只是被忽略,所有消息一次显示,就像没有任何超时一样。我试过$ .each,setTimeout,没什么用。那里有什么不对?

3 个答案:

答案 0 :(得分:2)

在这一行中要计算的错误太多:

        setInterval(processMessage(data[i]),2000);

正确版本:

setTimeout((function(i){return function(){processMessage(data[i])}})(i), 2000*i);

你的问题:

  • 您立即调用该函数 - 将其包装在函数
  • i将超出范围 - 将函数包装在闭包中
  • 使用交错间隔的setTimeout,以便更轻松地跟踪i

答案 1 :(得分:1)

您可以在setInterval

中自行循环,而不是使用for循环
success: function (data) {
    var i=0, keys=Object.keys(data), l=keys.length;
    var t=setInterval(function(){
        processMessage(data[i]);
        if(++i==l){clearInterval(t)}
    }, 2000);
}

这将每2秒重复一次,并在到达结束时停止。

答案 2 :(得分:0)

这是因为您在setInterval调用中立即调用该函数 - 传递函数,省略() - 但由于您需要一个参数 - 使用匿名函数:

setInterval(function() { processMessage(data[i]) },2000);

你现在可能会遇到i错误的问题(因为i将是运行时的最后一次迭代,所以将它包装在IIFE中)

(function(i) {
    setInterval(function() { processMessage(data[i]) },2000);
})(i)

或 - 如果可以,请在let循环中使用for

for(let i=0, keys=Object.keys(data), l=keys.length; i<l; i++) {
    setInterval(function() { processMessage(data[i]) },2000);
}