getJSON同步

Fre*_*red 36 ajax jquery sync synchronous getjson

目标:我想要的是从数据库中获取数据并刷新main.php(通过draw_polygon更明显)每次在数据库中添加内容时(在$ .ajax之后提交给submit_to_db.php).

所以基本上我有一个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);
         });
    }
 });
Run Code Online (Sandbox Code Playgroud)

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

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

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

cch*_*lis 49

由于$ .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
});
Run Code Online (Sandbox Code Playgroud)

  • 我不会使用global-config方法来避免不可预测的行为.引自jQuery文档:"我们强烈建议不要使用此API.而是在调用中显式设置选项或定义一个简单的插件来执行此操作".请参阅我的[回答](http://stackoverflow.com/a/28677041/1183010)如何执行此操作. (2认同)

tob*_*spr 22

异步意味着请求在后台运行,并在收到响应时调用您的函数.如果您想获得结果但允许在请求中使用您的应用,则此方法最佳.如果您想要直接响应,请查看同步请求.此请求将暂停脚本执行,直到收到响应,并且用户在收到响应之前无法执行任何操作.您可以通过以下方式切换:

async: false,
Run Code Online (Sandbox Code Playgroud)

例如:

$.ajax({
    url: "myurl",
    async: false,
    ...
})
Run Code Online (Sandbox Code Playgroud)

  • 请显示**在哪里**添加参数`async:false`或显示示例. (7认同)

Rob*_*kal 19

$ .getJSON(),不接受配置,因为它在文档中说它是一个速记版本:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});
Run Code Online (Sandbox Code Playgroud)

所以只需重写你的请求和async:false就会像你期望的那样工作.


R. *_*olt 11

$.getJSON()是一种$.ajax()可以配置为同步的简写表示法(请参阅jQuery.getJSONJQuery.ajax):

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

尽量避免同步调用.从jQuery doc引用(参见async prop):

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

您可能想尝试像这样的jQuery Deferred:

var jqxhr = $.getJSON(url);
jqxhr.done(function(data) {
    ...
    draw_polygon(data);
});
Run Code Online (Sandbox Code Playgroud)