使用闭包强制同步javascript

使用闭包强制同步javascript,javascript,Javascript,此代码挂起 我有理由相信这是因为匿名函数中的响应是一个新变量,与外部作用域无关。我如何解决这个问题 function foo() { //... var url = "http://urliciously-urlish-url" response = null; $.get(url, function (data) {response = data; }); while( response ===

此代码挂起

我有理由相信这是因为匿名函数中的响应是一个新变量,与外部作用域无关。我如何解决这个问题

function foo() { //...

    var url = "http://urliciously-urlish-url"
    response = null;
    $.get(url, function (data) {response = data;
                               });

    while( response === null)
    {
        1;
    }
    console.log(response);

    //...
}

注意,我知道这种设计将(像轮询系统一样)挂起页面,直到响应变为非空。在这个上下文中这没关系。

当代码运行时,事件处理程序不会运行

翻译:这段代码不起作用


如果您想使用JS,您几乎肯定必须习惯于编写异步代码。

当代码运行时,事件处理程序不会

翻译:这段代码不起作用


如果您想使用JS,您几乎肯定必须习惯于编写异步代码。

不,问题是回调永远不会执行,因为JS线程仍在运行。它将等待当前上下文结束,然后再继续执行“next tick”(此处的回调)。在刻度之间,它还可能更新DOM并处理其他事情


不要使用挂环,而是使用一个(是的,这是可能的)。在jQuery中:。然而,它将“只”挂起,直到请求结束——这可能永远不会发生。不可响应的GUI是最糟糕的事情,所以不要使用它。

不,问题是回调永远不会执行,因为JS线程仍在运行。它将等待当前上下文结束,然后再继续执行“next tick”(此处的回调)。在刻度之间,它还可能更新DOM并处理其他事情


不要使用挂环,而是使用一个(是的,这是可能的)。在jQuery中:。然而,它将“只”挂起,直到请求结束——这可能永远不会发生。不可响应的GUI是最糟糕的事情,所以不要使用它。

$。get
是异步的。如果确实希望同步,则必须使用
$.ajax
函数:

$.ajax({
    url: url,
    async: false,
    success: function(data) {
        response = data;
    }
});

话虽如此,我同意赵的观点——您应该习惯于编写异步代码。

$。get
是异步的。如果确实希望同步,则必须使用
$.ajax
函数:

$.ajax({
    url: url,
    async: false,
    success: function(data) {
        response = data;
    }
});

话虽如此,我同意赵的观点——你应该习惯于编写异步代码。

你确认过你的$.get正在返回东西吗?下面的答案是正确的——一般来说,异步编写是你应该做的——但是一个快速的争论点:仅仅因为url是正确的,这并不意味着使用chrome inspector、fiddler或其他工具来确认您正在获取数据是不明智的。@CrisCarew:我确实检查过,这就是我知道的原因。:)您是否确认您的$.get正在返回内容?下面的答案是正确的-通常,异步写入是您应该做的-但是一个快速的争论点:仅仅因为url是正确的,并不意味着使用chrome inspector、fiddler、,或者其他一些东西来确认您正在获取数据。@CrisCarew:我确实检查过,这就是我知道的原因。:)