等待异步任务完成

时间:2013-09-10 22:27:14

标签: javascript jquery asynchronous

我正在与第三方JavaScript库进行交互,其中一些函数调用是异步的。我没有将异步逻辑应用到我的应用程序中,而是首选向这些异步调用编写同步包装器。我知道,我知道,这是一个糟糕的设计,但这是一个很有可能被完全重写的演示项目。我需要一些东西向团队展示这个概念,而不是真的不得不担心性能。

这就是我想做的事情:

function sync_call(input) {
    var value;

    // Assume the async call always succeed
    async_call(input, function(result) {value = result;} );

    return value;
}

我尝试了jQuery的延迟和承诺,但它似乎是针对异步设计模式。我想在我的代码中使用同步模式。

2 个答案:

答案 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);
    } );
}