0

此代码挂起。

我有理由确定这是因为匿名函数中的响应是一个与外部范围无关的新变量。我该如何解决这个问题?

function foo() { //...

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

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

    //...
}

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

4

3 回答 3

3

$.get是异步的。如果您真的希望这是同步的,则必须使用该$.ajax功能:

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

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

于 2012-04-18T18:18:39.423 回答
1

当您的代码正在运行时,事件处理程序不会。

翻译:此代码不起作用。

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

于 2012-04-18T18:17:19.493 回答
0

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

使用同步 ajax 请求而不是使用悬挂循环(是的,这是可能的)。在 jQuery 中:{async:false}. 但是,它将“仅”挂起,直到请求结束——这可能永远不会发生。不负责任的 GUI 是最糟糕的事情,所以不要使用它。

于 2012-04-18T18:18:04.743 回答