我正在尝试编写一个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
被执行?
感谢您的帮助,对不起我的坏英语:)
答案 0 :(得分:1)
load()
函数pretty much the same为get()
函数 -
此方法是从服务器获取数据的最简单方法。它是 大致相当于$ .get(url,data,success),除了它是一个 方法而不是全局函数,它有一个隐式回调 功能
通过使用稍微更详细的ajax()
函数,您将能够将{{1>}设置为false的请求指定为 synchronous 。也许这将解决您的问题。
一个简单的同步ajax调用:
async
参考文献 -
答案 1 :(得分:0)
如果目标没有将内容加载到元素中,而是获取内容并将其保存到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?
});
编辑:请注意,请求仍将以异步方式启动,在这种情况下,您可能会有大量并行请求,当收到每个请求的响应时,将运行完成(或失败)块中的代码。 / p>