如何使JavaScript ajax异步调用看起来是同步的?

如何使JavaScript ajax异步调用看起来是同步的?,javascript,ajax,asynchronous,Javascript,Ajax,Asynchronous,我正在使用Dhtmlx UI库。在他们的网格组件中,您可以使用“OnEdit”方法动态检查输入。该方法提供以下参数:rowid、colid、newval、oldval 大多数情况下,我可以使用OnEdit方法验证或使输入的信息无效,具体取决于调用的列以及newval和oldval信息。因此,通常我的OnEdit方法如下所示: function OnEdit(rowid,colid,newval,oldval) { if first test fails return false; if

我正在使用Dhtmlx UI库。在他们的网格组件中,您可以使用“OnEdit”方法动态检查输入。该方法提供以下参数:rowid、colid、newval、oldval

大多数情况下,我可以使用OnEdit方法验证或使输入的信息无效,具体取决于调用的列以及newval和oldval信息。因此,通常我的OnEdit方法如下所示:

function OnEdit(rowid,colid,newval,oldval)
{
  if first test fails return false;

  if second test fails return false;

  etc.

  return true;
}
function OnEdit(rowid,colid,newval,oldval)
{
  if first test fails return false;

  if second test fails return false;

  //third test  
  Fetch data from server via async ajax and if different to currval then 
  return false.

  ......
  if nth test fails return false;

  etc.

  return true;
}
返回false会将字段值重置为oldval

但是,对于一个特定的情况,我需要返回服务器并检查一个值。如果本地保存的值不同,则需要返回false。因此,我修改后的方法如下所示:

function OnEdit(rowid,colid,newval,oldval)
{
  if first test fails return false;

  if second test fails return false;

  etc.

  return true;
}
function OnEdit(rowid,colid,newval,oldval)
{
  if first test fails return false;

  if second test fails return false;

  //third test  
  Fetch data from server via async ajax and if different to currval then 
  return false.

  ......
  if nth test fails return false;

  etc.

  return true;
}
当然,当第三个测试执行并完成时,系统已经到达测试的末尾并返回true


我需要知道如何设置第三个测试,以便系统在继续“第n个测试”之前等待结果。

我认为您必须在ajax选项中设置async:false。这将等待收到响应
从服务器。

这是不可能的。您可以通过使用async/await使其“看起来”同步,但您仍然不会从OnEdit返回true或false,而是返回一个挂起的承诺。您必须返回一个暂定的
true
,然后可能会更改ajax成功回调中的网格单元格。不过,您是否应该分离测试
但是,对于一个特定的情况,我需要返回服务器并检查一个值。
就我个人而言,我会模拟此服务响应,并在单独的测试中单独检查服务。我喜欢Chris G的建议。异步调用的速度足够快,用户在回调中被重新设置为“oldval”之前不会注意到发送了“true”。谢谢,我会尝试一下。只是为了证实克里斯·G的建议很有效。遗憾的是,同步ajax调用被弃用,理由是它会带来糟糕的用户体验……但这肯定是程序员和他们的客户机之间的问题,而不是标准权威机构的问题。但这是另一个肥皂盒。LOL.Sync ajax调用不推荐使用。