ajax 的第一个“a”代表异步,所以你试图做的有点违背 ajax 的哲学。但是,可以使用阻塞请求,但.get
简化接口不支持此功能,您必须使用以下.ajax
功能:
var foo = "hmmm";
$.ajax("jquery.js", {async:false, success:function(x){foo=x}});
alert(foo);
javascript的基本执行模型是基于事件和单线程的(有提供多线程能力的web worker,但是每个worker都生活在自己的地址空间中,不能与其他worker或与主线程共享任何内存......所以在感觉它们更类似于进程而不是线程)。
在 Javascript 中,您不能在循环中“等待”其他事情发生,您的函数必须始终快速终止,可能会附加回调以在发生某些事情时再次调用。如果您创建一个循环,则 javascript 引擎将卡在该循环中,并且不允许进行其他处理(如果可以从 javascript 中看到)。例如:
// Warning: WRONG example... this won't work!
var foo = 0;
setTimeout(function(){foo = 1}, 100); // Set foo=1 after 100ms
while (foo == 0) ; // Wait for that to happen
alert(foo);
不会工作,因为在主代码路径结束之前,不允许浏览器引擎执行其他 javascript 代码(超时回调)。
这种基于事件的方法大大简化了编程(因为不需要锁定......总是只有一个线程在操作状态),但强制使用不同的流程设计来进行长时间操作。
有一个执行线程这一事实也意味着,当您的 javascript 代码执行任何长时间的计算时,其他所有内容都会被阻止,并且浏览器看起来对用户没有响应。
这种无响应性就是为什么使用同步调用来检索资源被认为是一种不好的做法......从多个流中并发获取不同资源的艰巨工作已经由浏览器实现,但是您的 javascript 代码需要使用回调模型来能够利用此功能。