Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 让同步代码等待异步调用_Javascript_Jquery - Fatal编程技术网

Javascript 让同步代码等待异步调用

Javascript 让同步代码等待异步调用,javascript,jquery,Javascript,Jquery,我有一个表单,可以捕获提交事件。我必须等待$.post电话才能决定是否提交。我试过这个: $('#my_form').submit(function(event){ var data = null; $.post("/post/call").then(function(_data){ data = _data; }); if ( $.isPlainObject(data) && data.status === 'ko' ) { return f

我有一个表单,可以捕获提交事件。我必须等待
$.post
电话才能决定是否提交。我试过这个:

$('#my_form').submit(function(event){
  var data = null;

  $.post("/post/call").then(function(_data){
    data = _data;
  });

  if ( $.isPlainObject(data) && data.status === 'ko' ) {
    return false; // Do not submit the original form
  } else {
    // Submit the original form
  }
});
但是
data
结果总是
null
,如果
\u data
值化,也是如此,因为
$.post
是一个异步调用。如何等待
$.post
调用完成


编辑:如评论中所述,我希望避免使用
$.ajax({async:true})
,因为它会冻结页面;有没有办法在不冻结页面的情况下获得相同的效果?

您应该有某种标志,表明表单是否要提交,以及ajax正在处理。然后,当ajax调用通过时,调用
$(“#我的表单”).submit()
发送表单

松散地

var validated = false;
$('#my_form').submit(function(event){
   if (validated) {
      return true;
   }


  $.post("/post/call").then(function(_data){
    var data = _data;

    if ( $.isPlainObject(data) && data.status === 'ko' ) {
       // Do not submit the original form
    } else {
      validated = true;
      $('#my_form').submit();
  }
  });

  return false;
});
如果您使用的是MVC/C#,并且可以使用Json请求访问您的web服务,请了解以下内容

$.getJSON
是异步的

SOLUTION: $.ajax 

可以设置为synchronous(同步)

可能重复为什么不将要等待的操作放在异步回调的末尾?然后从何处获取.then()。一个回调函数在文章中附加一个逗号。您的if也必须在回调中,因为在post完成之前没有设置数据。请使用同步调用作为
Felix Kling
adviced。一切都可以通过
$获得。post
也可以通过
$获得。ajax
;我希望避免$.ajax({async:true}),因为它会冻结页面;有没有办法在不冻结页面的情况下获得相同的效果?您可能应该添加另一个标志,指示呼叫是否正在进行。
SOLUTION: $.ajax