42

目标:我所追求的是每次在数据库中添加某些内容时(在 $.ajax 到 submit_to_db.php 之后)从数据库中获取数据并刷新 main.php(通过 draw_polygon 更明显)。

所以基本上我有一个main.php,它将ajax调用另一个php来接收一个将保存到数据库的数组,而一个json调用另一个php来返回一个数组将被main.php使用。

$(document).ready(function() {
    get_from_db();
    $('#button_cancel').click(function(){
       $.ajax({
          url: 'submit_to_db.php',
          type: 'POST',
          data: {list_item: selected_from_list},

          success: function(result){
             ...
             get_from_db();
          }
       });
    });
    function get_from_db(){
         $.getJSON('get_from_db.php', function(data) {
             ...
             draw_polygon(data);
         });
    }
 });

就我而言,我所做的是get_from_db调用函数getJSON来实际从数据库中获取数据,并将数据用于draw_polygon. 但这是应该怎么做的吗?我是一个完整的新手,getJSON老实说,这也是我第一次尝试使用 ajax。所以我的问题是:异步实际上是如何工作的?是否有另一种解决方法,而不是必须调用函数get_from_dbgetJSON它不是同步的,是吗?这就是为什么当页面不在函数中时它不更新页面?)一直 -就像$.ajaxasync: false顺便说一句,我无法让它工作)。我的方法很有效,但我想也许还有其他更好的方法可以做到这一点。我很想学习如何。提前致谢。我希望我有任何意义。

为了更清楚,这就是我想要实现的目标:

  1. @start页,从数据库中获取数据(当前通过getJSON
  2. canvas使用_data
  3. 当我单击完成按钮时,它将更新数据库
  4. 我想再次自动获取数据以重新绘制画布中的更改。
4

4 回答 4

63

由于 $.getJSON() 使用 ajax 配置,只需设置全局 ajax 配置:

// Set the global configs to synchronous 
$.ajaxSetup({
    async: false
});

// Your $.getJSON() request is now synchronous...

// Set the global configs back to asynchronous 
$.ajaxSetup({
    async: true
});
于 2014-04-14T09:56:39.010 回答
28

异步确实意味着请求在后台运行,并在收到响应时回调您的函数。如果您想获得结果但允许在请求中使用您的应用程序,则此方法是最好的。如果您想直接响应,请查看同步请求。此请求将暂停脚本执行,直到它得到响应,并且用户在收到响应之前不能做任何事情。您可以通过以下方式切换它:

async: false,

例如:

$.ajax({
    url: "myurl",
    async: false,
    ...
})
于 2012-10-22T10:48:51.140 回答
20

$.getJSON(),不接受配置,因为它在文档中说它是以下的简写版本:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});

因此,只需根据它重写您的请求,async:false就会按您的预期工作。

于 2013-05-13T16:37:37.997 回答
14

$.getJSON()是一个简写符号$.ajax(),可以将其配置为同步(参见jQuery.getJSONJQuery.ajax):

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  async: false, 
  success: function(data) {
      ...
      draw_polygon(data);
  }
});

尽量避免同步调用。来自 jQuery doc 的引用(参见 async prop)

跨域请求和 dataType: "jsonp" 请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。

您可能想像这样尝试 jQuery Deferreds

var jqxhr = $.getJSON(url);
jqxhr.done(function(data) {
    ...
    draw_polygon(data);
});
于 2015-02-23T15:19:11.487 回答