Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.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/jQuery—是否可以封装并返回异步执行函数的结果?_Javascript_Jquery_Asynchronous - Fatal编程技术网

Javascript/jQuery—是否可以封装并返回异步执行函数的结果?

Javascript/jQuery—是否可以封装并返回异步执行函数的结果?,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,我知道这个问题已经被以许多不同的方式问过很多次了,但是我仍然很难找到下面这个问题的好的解决方案 在从外部函数返回之前,如何等待异步执行的内部函数的回调完成 function outer() { var result = false; var innerAsynch = function() { result = true; } setTimeout(innerAsynch, 1000); waitForInnerAsynch(); //bl

我知道这个问题已经被以许多不同的方式问过很多次了,但是我仍然很难找到下面这个问题的好的解决方案

在从外部函数返回之前,如何等待异步执行的内部函数的回调完成

function outer() {
    var result = false;
    var innerAsynch = function() {
        result = true;
    }
    setTimeout(innerAsynch, 1000);
    waitForInnerAsynch(); //blocking
    return result;  //true
}
1) 我很清楚,这对于99.999%的用例来说是不好的做法,所以请不要告诉我不应该这样做

2) 请随意完全重组此代码。。。我唯一的要求是outer()返回阻止浏览器的内容,直到innerAsynch()完成并通过以下测试:

 if(outer()) {
    //1 second later.... yippee!
 }
我也在使用jQuery,但我更愿意不使用插件,除非这样做真的有意义。谢谢

更新

我想重申,我的目标是在对outer()的同步调用中完全封装异步执行,而不带参数

换言之,这应该是可行的:

<a href="something" onclick="return outer()">A very slow link</a>


也许这实际上是不可能的,在这种情况下,我可以使用回调,但我想更好地理解为什么会出现这种情况。

标准js模式。您只需要使用回调:

function outer(callback) 
{
    var innerAsynch = function(innerCallback) {
        var result = true;
        innerCallback(result);
    }

    setTimeout(function()
    {
      innerAsynch(function(result)
      {
        callback(result);
      });

    }, 1000);
}
用法:

outer(function(result)
{
  if ( result )
    //true
  else
    //false
});
我想重申,我的目标是在对outer()的同步调用中完全封装异步执行,而不带参数

异步执行和回调存在的唯一原因是没有阻塞。如果你真的想阻止,不要使用异步代码。如果您确实依赖异步函数,请重新构造代码以使用回调。就这么简单


JavaScript是单线程的,因此,如果您阻塞,浏览器似乎会冻结,直到您的代码解锁。当您阻塞时,甚至无法更新UI以通知用户正在执行某些长时间运行的操作。这就是为什么它不好。请记住,该语言是围绕事件循环和异步事件队列设计的;试图违背这一点只会让人头疼。

在我看来,
outer
会在调用
setTimeout
后立即返回。这是如何回答这个问题的?在3个不同的位置使用相同的变量名
result
,这真的很让人困惑,但这些实际上是不同的变量(不是吗?)。函数outer中的变量result是不需要的。我仍然不知道这是如何等待超时的
outer
仍然会立即返回,只是回调函数直到稍后才会被调用。而且
outer
不返回值,因此它不能在
if
@KirillIvlev中使用-这很有效,我已经在JS Fiddle中进行了测试,但如果可能的话,我希望避免回调。有没有办法让
outer()
调用花1秒时间返回
true
,而不使用回调参数?在js中,阻塞不是这样做的。看看承诺-@bfavareto-好的建议。在发布之前,我一直在研究promise对象,但我正在将这个概念应用到这个示例中。延迟jquery对象是基于回调的。jQuery只是对它们进行了抽象,我完全理解您的意思,并且我知道这在浏览器领域不是一个正常的请求。我有一个非常特殊的用例,我正在为Phonegap创建的iOS确认通知创建一个适配器,这样它们就像调用window.confirm()一样,这是一个阻塞操作。他们使用了一种回调机制,我想将其封装在一个同步方法调用中,这就是我提出这个问题的原因。如果您真的希望它的行为像
window.confirm()
,我想您唯一的选择就是用本机Objective C代码编写它,然后向它添加一个js接口。本机代码应该能够阻止整个
UIWebView
线程(但是我对Phonegap和objc知之甚少,所以如果我说了一些愚蠢的话,请纠正我)。在JS/HTML中,必须使用覆盖div来阻止UI,并在上面创建一个类似模式的对话框。JavaScript不提供任何您希望的阻止方法,因此我提到的头痛。。。