等待异步任务完成

Cod*_*ent 40 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;
}
Run Code Online (Sandbox Code Playgroud)

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

bit*_*oiu 32

这将永远不会起作用,因为JS VM已经从async_call转移并返回了您尚未设置的值.

不要试图打击自然和内置的语言行为.您应该使用回调技术或承诺.

function f(input, callback) {
    var value;

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

}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用一个承诺,看看Q.这样你就可以返回一个promise,然后你将一个then侦听器附加到它,这与回调基本相同.当promise解决后,将触发.

  • 这看起来不正确,实际上非常有趣,因为sync_call签名与async_call签名完全相同,并且完全是多余的.如果sync_call接受回调,则它不再是同步的.它返回的价值在哪里?它在退出之前不返回值.如果它是同步的,它必须在返回/退出时返回该值. (8认同)