【问题标题】:Wait for AJAX to return success before continuing Javascript code?在继续 Javascript 代码之前等待 AJAX 返回成功?
【发布时间】:2017-03-08 01:57:30
【问题描述】:

我知道,类似的问题已经问过很多次了,但我的情况相当具体,据我所知,以前从未有人提到过。至少从我能找到的情况来看。

我正在做的是使用 UID 构建对象。构建对象的所有内容都需要此 UID,并且需要先验证它是唯一的,然后才能对其进行任何操作。

我在 javascript 中随机生成 UID,并对照 SQL 数据库中的所有其他条目检查它。我正在使用 PHP 和 Ajax 发布到数据库。

我遇到的核心问题是 Javascript 不等待 Ajax 响应,而是继续滚动。 Ajax 必须使用成功处理程序。这对我来说是绝对不可能使用的,因为在我确定 UID 已经过验证之前,我不能做任何事情。

是否有任何解决方法或解决方案? Promise 不起作用,因为正如我之前所说,UID 在构建对象时是不可或缺的,因此使用占位符是行不通的。

提前致谢!

【问题讨论】:

  • 如果您使用 jQuery,请查看 $.ajax 的 async 设置(将其设置为 false) - 另请参阅 api.jquery.com/jQuery.ajax
  • so.... 为什么不能等到第一个 ajax 调用成功返回后再创建对象?你可以从那个成功回调中踢出对象创建方法,对吧?
  • 看起来您正在客户端生成 UID,然后从服务器/数据库进行验证。不能在服务器上生成一个经过验证的UID,第一次加载的时候传给页面吗?
  • @Kats 等等,为什么 promises 不起作用?你可以说 verify(UUID).then(dowhatever) ,不是吗?
  • 从哪里生成 UID 并不重要,事实是我必须等待它。正在创建的对象是客户端的,虽然理论上我可以在回调函数中运行对象创建代码,但这首先需要对我几乎所有的对象创建代码进行重大重写,并且考虑到我在问问题在这个网站上,我的时间有点紧张。

标签: javascript php sql ajax database


【解决方案1】:

你可以像这样发送一个同步的 Ajax 请求:

var response = $.ajax({ url : "http://api.jquery.com/jquery.ajax/", async : false });

(虽然这不是一个很好的做法)

【讨论】:

  • 这就是我试图避免的,使用async:false。我也知道在许多浏览器中显然不推荐使用异步,这是另一个大问题。 async 会阻止 all Javascript 运行还是仅阻止特定堆栈继续运行?
  • 是的,但它的行为就像第一次加载页面时一样,所以一切都必须等到返回成功!
  • 它基本上锁定了浏览器。这就是同步调用被高度弃用的原因
  • 这正是我要避免的问题。我更精通 C++,所以使用 Javascript 和异步语言是相当混乱的。
  • >异步是阻止所有 Javascript 运行还是只阻止特定堆栈继续运行?好吧,它会阻止当前代码块的执行,并且由于 Javascript 是单线程的(不考虑 WebWorkers 之类的边缘情况),在完成之前不会运行其他 Javascript 代码。
【解决方案2】:

好的。一种可能的解决方案是,如果您的 UID 是在服务器上随机生成的,您可以将其直接提供给带有 script 标签的 index.html。

<head>
<script src="path_to_url_that_provides_generated_script"></script>
<script .... other scripts></script>
</head>

这个生成的脚本会是这样的:

var UID = "xxxx-xxxx-xxxx-xxxx";

这样您甚至不需要执行 ajax 请求,因为在处理任何其他脚本之前您的 uid 就会知道。

【讨论】:

    【解决方案3】:

    我发现最好的方法是重写我的代码,在我首先获得 UID 之前不开始创建对象。虽然这确实需要相当长的时间来完成并确保不存在笨拙的错误,但没有其他真正的解决方案既简单又有效。

    事实证明,远见似乎总是让优秀的程序员不再编写和重写他们的工作。

    特别感谢@Vladimir M 的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-02
      • 2019-04-23
      • 1970-01-01
      • 2011-11-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多