2012-08-06 39 views
0

在龙卷风,我们有gen模块,这使我们能够写出结构是这样的:JQuery的/ JavaScript的内联回调

def my_async_function(callback): 
    return callback(1) 

@gen.engine 
def get(self): 
    result = yield gen.Task(my_async_function) #Calls async function and puts result into result variable 
    self.write(result) #Outputs result 

我们有相同的语法糖jquery或其他JavaScript库?

我想是这样的:

之前1.8支持 sync ajax calls via the async: false setting的jQuery
function get_remote_variable(name) { 
    val = $.sweetget('/remote/url/', {}); //sweetget automatically gets callback which passes data to val 
    return val 
} 
+0

有可能是编译为Javascript,让这个语言,但是我不认为这是一个很好的办法做到这一点在Javascript。 – 2012-08-06 15:49:30

回答

1

你所描述的功能为“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/

+0

'gen'的特征是那个呼叫是非阻塞的。所以我可以并行启动10个异步函数并在它们的完成写入结果上。我也可以顺序使用它们,并将结果从一个传递到另一个。替代记录如下所示: 'func(args,callback =(yield gen.Callback(key)))' 'result = yield gen.Wait(key)'无论如何,谢谢你的基本答案。 – 2012-08-06 19:09:54

1

版本。它有一个限制(没有跨域或jsonp,锁定浏览器),我会尽可能避免它。

有几种可用的库为Javascript中的异步操作提供一些语法糖。例如:

...但我觉得没有什么提供您正在寻找的同步语法 - 总有涉及一个回调,因为路JavaScript在浏览器中运行。