【问题标题】:Returning data from anonymous, asynchronous functions? [duplicate]从匿名、异步函数返回数据? [复制]
【发布时间】:2011-05-20 04:17:45
【问题描述】:

考虑:

function ajaxCall(url, callback) {
    $.ajax({
        type: "GET",
        url: url,
        success: function (data) { // <-- fail point: where does the returned data go, now?
            // do stuff with data
            if ( callback ) {
                var ret = callback();
                if ( ret !== undefined ) {
                    return ret;
                }
            }
        }
    });
}

function fooBar() {
    return ajaxCall('some/url', function () {
        // do stuff
        return some_value;
    }
}

对,所以基本上,我想保留请求的异步性,这样浏览器就不会挂起,但最终仍然会返回一个值......这是一个简化的例子,尽管我甚至可以简化它更多。

事实上,我看到的唯一障碍是$.ajax 与其success: 匿名函数之间的转换。

哼。

【问题讨论】:

  • 等等,这甚至不是有效的 JavaScript...
  • 是的,对不起。 $.ajax 未能从我的脑海中传递到屏幕上。
  • 啊,我明白了。想必是复制粘贴错误。 :)

标签: javascript jquery asynchronous return anonymous


【解决方案1】:

您不能像这样异步使用调用,回调会在您的调用函数早已返回之后稍后运行。相反,您需要做的是调用需要数据的函数作为(或整个)回调的一部分,例如:

function ajaxCall(url, callback) {
  $.ajax({
    type: "GET",
    url: url,
    success: callback
  });
}

function fooBar() {
    ajaxCall('some/url', function (data) {
        functionThatNeedsData(data);
    });
}

这只是一个展示正在发生的事情的例子,实际上它可能只是:

function fooBar() {
  $.get('some/url', functionThatNeedsData);
}

这只是调用你的functionThatNeedsData,它从请求中获取数据作为第一个参数......所以一旦服务器响应数据,你就会将它传递到它需要做的地方并做剩下的事情你对这些数据的工作。

【讨论】:

  • 但是我希望该函数返回数据!哦,好吧,我只需要走很长的路……
  • @passcod - 我不知道该说什么......这就是异步调用的工作方式,如果你可以返回,它们将是同步的 :)
  • 没错。但是现在我需要添加更多的异步来获得我想要的......即自定义事件。不过,这个答案是正确的。
猜你喜欢
  • 1970-01-01
  • 2015-08-15
  • 2016-08-11
  • 2015-04-21
  • 2016-01-14
相关资源
最近更新 更多