你所描述的功能为“my_async_function”,但你使用它的方式是synchronous而不是asynchronous。
您的示例代码需要阻止 - 如果“my_async_function”是真正的异步(非阻塞),则在调用“my_async_function”后,将立即执行以下代码行self.write(result)
。如果函数需要任何时间(我的意思是任何)返回一个值,那么self.write(result)
最终会写入什么?也就是说,如果在result
之前有self.write(result)
执行有值,则不会得到预期的结果。因此,“my_async_function”必须被阻塞,它必须在前进之前等待返回值,因此它不是异步的。
关于你的问题,$.sweetget('/remote/url/', {})
:为了做到这一点,你必须能够阻止,直到ajax请求(它本质上是异步的 - 它把AJ中的第一个A)带回来。
直到XHR状态已经发生改变,您可以通过延迟sweetget
返回砍同步调用,但你会使用while
环(或类似的东西)和风险阻塞浏览器的UI线程或掀起了其中的一个“这个剧本花费太长时间”警告。 Javascript不提供线程控制。你不能指定你当前的线程正在等待,所以继续前进并做一些其他的事情。您也可以通过手动测试超时阈值来抗衡这一点。
现在人们应该开始怀疑:为什么不只是使用回调?无论你如何分片,Javascript都是单线程的。没有sleep
,没有thread.sleep
。这意味着任何同步代码都会阻止用户界面。
在这里,我嘲笑了sweetget
大致看起来像什么。正如你所看到的,只要执行进入紧密的while
循环,浏览器线程就会锁定。事实上,在我的电脑上,在浏览器显示无响应脚本对话框之前,ajax请求不会被触发。
// warning: this code WILL lock your browser!
var sweetget = function (url, time_out) {
var completed = false;
var result = null;
var run_time = false;
if (time_out)
run_time = new Date().getTime();
$.ajax({
url: url,
success: function(data) {
result = data;
completed = true;
},
error: function() {
completed = true;
}
}); // <---- that AJAX request was non-blocking
while (!completed) { // <------ but this while loop will block
if (time_out) {
if (time_out>= run_time)
break;
run_time = new Date().getTime();
}
}
return result;
};
var t = sweetget('/echo/json/');
console.log('here is t: ', t);
试试:http://jsfiddle.net/AjRy6/
有可能是编译为Javascript,让这个语言,但是我不认为这是一个很好的办法做到这一点在Javascript。 – 2012-08-06 15:49:30