0

我正在尝试编写一个 Greasemonkey 脚本,其中.load()使用 for 循环加载不同的页面并将它们的一些信息存储在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);
   });
}

当我alert("foo")在回调函数和 for 循环结束之间插入时,一切正常,因为该.load函数已加载,而我在警报窗口中单击“确定”。有没有办法让 for 循环等到整个.load执行完毕?

谢谢你的帮助,对不起我的英语不好:)

4

2 回答 2

1

load()功能与功能几乎相同get()-

此方法是从服务器获取数据的最简单方法。它大致相当于 $.get(url, data, success) ,只是它是一个方法而不是全局函数,并且它具有隐式回调函数。

通过使用稍微详细一点的ajax()函数,您将能够指定要同步的请求,并将其async设置为 false。也许这会解决你的问题。

一个简单的同步 ajax 调用:

$.ajax({
  url: "example.php",
  data : yourData,
  async : false
},function(response){
  // this is the callback
});

参考 -

于 2013-02-19T19:29:33.820 回答
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?
});

编辑:请注意,请求仍将异步启动,在这种情况下,您可能有很多并行请求,完成(或失败)块中的代码将在收到每个请求的响应时运行。

于 2013-02-19T19:32:54.373 回答