2010-06-29 23 views
2

我相当新的javascript回调式编程风格。 有没有办法强制代码等待,直到一个函数调用通过回调完成? 让我解释一下。 以下函数接受一个数字并根据它返回结果。暂停,直到调用回调,在Javascript中

function get_expensive_thing(n) { 
    return fetch_from_disk(n); 
} 

到目前为止,很容易。 但是,fetch_from_disk反而通过回调返回结果,我该怎么办? 像这样:

function get_expensive_thing(n) { 
    fetch_from_disk(n, function(answer) { 
    return answer; // Does not work 
    }); 
} 

以上不工作,因为return是在匿名函数的范围, 而非get_expensive_thing功能。

有两种可能的“解决方案”,但都不足。 一是重构get_expensive_thing本身有回调回答:

function get_expensive_thing(n, callback) { 
    fetch_from_disk(n, function(answer) { 
    callback(answer); 
    }); 
} 

另一种是重新编写fetch_from_disk,但是这是不是一种选择。

我们如何才能达到预期的效果 同时保持get_expensive_thing 所期望的行为 - 即等到fetch_from_disk调用回调,然后返回答案吗?

回答

2

在浏览器Javascript中几乎没有“等待”。这都是关于回调。请记住,您的回调可以是“关闭”,这意味着函数的定义从创建它们的上下文中“捕获”局部变量。

如果你喜欢这种做事的方式,你会是一个更开心的人。

+0

即使你可以等待,你所要求的非响应浏览器通过这样做。 – JohnFx 2010-06-29 23:18:23

+0

这很公平。我的目的是确定它实际上是不可能的,以创建一个返回通过回调获得的值的函数。 – jameshfisher 2010-06-29 23:19:01

0

添加在缺少返回:)

function get_expensive_thing(n) { 
    return fetch_from_disk(n, function(answer) { 
    return answer; 
    }); 
} 
+0

也许我没有说清楚:在这个例子中,'fetch_from_disk'已经改变了它的行为,而是通过回调返回结果。所以它的返回值实际上是'未定义的'。 – jameshfisher 2010-06-29 23:17:09

+0

你说得很清楚,但很多人也回来了回调的结果,想想fetch_from_disk(n,c){return c(val)} - 如果这是噪音,请道歉:) – nathan 2010-06-29 23:21:38

相关问题