Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待异步任务完成_Javascript_Jquery_Asynchronous - Fatal编程技术网

Javascript 等待异步任务完成

Javascript 等待异步任务完成,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,我正在与第三方JavaScript库交互,其中一些函数调用是异步的。我宁愿为这些异步调用编写同步包装器,而不是将异步逻辑应用到我的应用程序中。我知道,我知道,这是一个糟糕的设计,但这是一个演示项目,完全重写的可能性非常高。我需要一些东西来向团队展示这个概念,而不是真的需要担心表现 以下是我想做的: function sync_call(input) { var value; // Assume the async call always succeed async_ca

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

以下是我想做的:

function sync_call(input) {
    var value;

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

    return value;
}

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

从回调中调用函数而不是在sync_call()中返回值怎么样


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

不要试图与自然和固有的语言行为抗争。您应该使用回调技术或承诺

function f(input, callback) {
    var value;

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

}

另一个选择是使用承诺,看看。通过这种方式,您返回一个承诺,然后向其附加一个侦听器,这与回调基本相同。当承诺解析时,then将触发。

这不是一个正确的答案,因为回调没有在参数列表中定义。通过一些小的调整是可行的,但实际上与jQuery的承诺模式没有太大区别。感谢您的回答。您不能为异步任务创建同步包装器。使用延迟/承诺模式!可能是好的复制品,我没意识到。它可以在C(互斥)和C#(NET有内置的支持)中实现。那我就把整件事重做一遍。我的团队最熟悉C#,所以如果我认为如果我写的代码尽可能接近C#,那么它被接受的可能性会更大。这看起来不正确,实际上非常有趣,因为sync#u调用签名与async#u调用签名完全相同,并且是完全冗余的。如果sync_调用接受回调,则它不再是同步的。它返回的值在哪里?它在退出之前不会返回值。如果它是同步的,它必须在返回/退出时返回值。谁命名函数
sync
async
?关键是,用户正在进行异步调用,回调函数希望在原始函数的范围内解析该调用。我的一段非常简单和天真的代码向其原始函数添加了一个回调,并在函数末尾停止了对var
值的处理。对于使用与OP相同的函数名的许多批评,我决定更改它。
function f(input, callback) {
    var value;

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

}