我正在与第三方JavaScript库进行交互,其中一些函数调用是异步的。我没有将异步逻辑应用到我的应用程序中,而是首选向这些异步调用编写同步包装器。我知道,我知道,这是一个糟糕的设计,但这是一个很有可能被完全重写的演示项目。我需要一些东西向团队展示这个概念,而不是真的不得不担心性能。
这就是我想做的事情:
function sync_call(input) {
var value;
// Assume the async call always succeed
async_call(input, function(result) {value = result;} );
return value;
}
我尝试了jQuery的延迟和承诺,但它似乎是针对异步设计模式。我想在我的代码中使用同步模式。
答案 0 :(得分:30)
这将永远无法正常工作,因为JS VM已经从async_call转移并返回了您尚未设置的值。
不要试图打击自然而内置的语言行为。您应该使用回调技术或承诺。
function f(input, callback) {
var value;
// Assume the async call always succeed
async_call(input, function(result) { callback(result) };
}
另一种选择是使用承诺,看一下Q。这样你就可以返回一个promise,然后你将一个then侦听器附加到它,这与回调基本相同。当承诺结算时,那么将触发。
答案 1 :(得分:0)
如何在回调中调用函数而不是在sync_call()中返回值?
function sync_call(input) {
var value;
// Assume the async call always succeed
async_call(input, function(result) {
value = result;
use_value(value);
} );
}