在继续Javascript代码之前,等待AJAX返回成功?

在继续Javascript代码之前,等待AJAX返回成功?,javascript,php,sql,ajax,database,Javascript,Php,Sql,Ajax,Database,据我所知,类似的问题已经被问过很多次了,但我的案例相当具体,据我所知,以前从未涉及过。至少从我能找到的情况来看 我正在做的是使用UID构建对象。构建对象时使用的所有内容都需要此UID,并且需要先验证其唯一性,然后才能使用它执行任何操作 我在javascript中随机生成UID,并对照SQL数据库中的所有其他条目进行检查。我正在使用PHP和Ajax发布到数据库中 我遇到的核心问题是Javascript不等待Ajax响应,而是继续运行。Ajax必须使用成功处理程序。这是严格不可能为我使用,因为我不能

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

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

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

我遇到的核心问题是Javascript不等待Ajax响应,而是继续运行。Ajax必须使用成功处理程序。这是严格不可能为我使用,因为我不能做任何事情,直到我确定的UID被验证

有什么解决办法吗?承诺不会起作用,因为正如我前面所说的,UID在构建对象本身时是不可或缺的,所以使用占位符不会起作用


提前谢谢

您只需发送一个同步Ajax请求,如下所示:

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

(尽管这不是一个很好的做法)

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

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

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

我发现,最好的方法是重写代码,在我拥有uid之前不开始创建对象。虽然这确实需要花费大量的时间来完成,并确保不存在笨拙的bug,但没有其他既简单又有效的真正解决方案

事实证明,远见卓识似乎总能阻止优秀程序员再次编写和重写他们的工作


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

如果您正在使用jQuery,请查看$.ajax的
async
设置(将其设置为
false
)-另请参见。。。。为什么不能等到第一次ajax调用成功返回后再创建对象呢?您可以从成功回调中启动对象创建方法,对吗?看起来您正在客户端生成UID,然后从服务器/db进行验证。你不能在服务器上生成一个经过验证的UID并在第一次加载时传递到页面吗?@Kats等等,为什么承诺不起作用?你可以说verify(UUID)。然后(dowhatever),不是吗?不管UID是从哪里生成的,我都必须等待它。正在创建的对象是客户端的,虽然理论上我可以在回调函数中运行对象创建代码,但这首先需要对几乎所有的对象创建代码进行重大重写,鉴于我在这个网站上提问,我现在也有点时间紧绌。这是我试图避免的,正在使用
async:false
。我还知道,显然异步在许多浏览器中是不推荐的,这是另一个巨大的问题。异步是阻止所有Javascript运行,还是只阻止特定堆栈继续运行?是的,但其行为类似于首次加载页面,因此所有内容都必须等待成功返回!它基本上锁定了浏览器。这就是为什么同步呼叫被高度否认的原因,这正是我试图避免的问题。我更精通C++,所以使用JavaScript和异步语言是相当混乱的。> Asic是否阻止所有JavaScript运行或者仅仅阻止特定的堆栈继续吗?好吧,它会阻止当前代码块的执行,而且由于Javascript是单线程的(不考虑WebWorkers之类的边缘情况),在它完成之前,不会运行其他Javascript代码。
var UID = "xxxx-xxxx-xxxx-xxxx";