我有一个包含序列化对象列表的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,没什么用。那里有什么不对?
答案 0 :(得分:2)
在这一行中要计算的错误太多:
setInterval(processMessage(data[i]),2000);
正确版本:
setTimeout((function(i){return function(){processMessage(data[i])}})(i), 2000*i);
你的问题:
i
将超出范围 - 将函数包装在闭包中setTimeout
,以便更轻松地跟踪i
答案 1 :(得分:1)
您可以在setInterval
。
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);
}