2016-10-25 53 views
-3

我知道很多其他时间都有人问过类似的问题,但我的案例比较具体,据我所知,以前从未涉及过。至少从我能找到的。在继续使用Javascript代码之前等待AJAX​​返回成功?

我在做什么是使用UID构建对象。该对象所构建的所有东西都需要这个UID,并且需要在它完成任何事情之前将其验证为唯一的。

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

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

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

在此先感谢!

+0

如果您使用jQuery,请查看$ .ajax的'async'设置(将其设置为'false') - 另请参阅http://api.jquery.com/jQuery.ajax/ – Andreas

+1

so .. ..为什么你不能等待创建一个对象,直到你的第一个Ajax调用返回成功?您可以从该成功回调中踢对象创建方法,对吧? –

+0

看起来您正在客户端生成UID,然后从服务器/数据库进行验证。你不能在服务器上生成已验证的UID并在第一次加载时传递给页面吗? –

回答

1

您只需发送一个同步Ajax请求,这样的:

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

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

+0

这就是我试图避免使用'async:false'。我也意识到很显然,在许多浏览器中不赞成使用异步,这是另一个值得关注的问题。 异步是否阻止_all_ Javascript运行,或者它只会阻止该特定堆栈继续运行? – Kats

+0

是的,但是它的行为就像第一次加载页面一样,所以一切都要等到成功返回时! – Dennisrec

+0

它基本上锁定了浏览器。这就是为什么同步呼叫被高度拒绝 –

0

确定。一种可能的解决方案,如果您的UID随机生成在服务器上,您可以使用脚本标记直接将其提供给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会知道。

0

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

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

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

相关问题