我正在尝试编写一个Greasemonkey脚本,其中不同的页面使用for循环加载.load()
,并将它们的一些信息存储在localStorage
中。我的问题是:因为.load()
是异步的,所以它不能很好地工作。我的脚本只存储我试图存储的Last值。我认为这是因为我在回调函数中使用了var i
,并且当回调函数被触发时,i
已经有了另一个值。
for (var i = 0; i < plantsDiv.length; i++)
{
objectid = plantsDiv[i].getAttribute('objectid');
$("#wrap").load("index.php?objectid="+ objectid,function(){
//[...] what is happening
window.localStorage.setItem(objectid,value);
});
}
当我在回调函数和for循环结束之间插入alert("foo")
时,一切都正常,因为.load
函数已加载,而我正在警报窗口中单击"确定"。有没有办法让for循环等待整个.load
被执行?
谢谢你的帮助,也很抱歉我英语不好:)
load()
函数与get()
函数非常相似
此方法是从服务器获取数据的最简单方法。是的大致相当于$.get(url、data、success),只是它是方法而不是全局函数,并且它有一个隐式回调作用
通过使用稍微详细一点的ajax()
函数,您将能够指定请求为同步,async
设置为false。也许这会解决你的问题。
一个简单的同步ajax调用:
$.ajax({
url: "example.php",
data : yourData,
async : false
},function(response){
// this is the callback
});
参考资料-
$.ajax()
$.get()
load()
如果目标不是将内容加载到元素中,而是获取内容并将其保存到localStorage中,则应该使用$.get(如果要发布数据,则使用$.post)。
jQuery ajax函数返回一个jqXHR对象,该对象派生自Deferred对象,因此可以使用.done()表示成功,使用.fail()表示失败:
$.get("index.php?objectid="+ objectid)
.done(function(data) {
window.localStorage.setItem(objectid,data);
})
.fail(function() {
// try again later?
});
编辑:请注意,请求仍将异步启动,在这种情况下,您可能有很多并行请求,当收到每个请求的响应时,完成(或失败)块中的代码将运行。