如何使用jQuery等待来自回调的异步调用?

ope*_*sas 2 javascript ajax jquery asynchronous

我正在使用基于select2 jQuery的替换组合框,我必须定义一个回调来处理从json rest Web服务收到的数据.

问题是,在同一个回调中,我必须发出另一个GET请求来获取匹配记录的总数,以便select2可以决定是否必须加载更多结果(它具有无限滚动功能)

代码是这样的:

$("#country").select2({
  ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
    url: 'http://localhost:9000/api/countries',
    dataType: 'json',
    data: function(term, page) {
      return {
        filter: term,
        page: page,
        len: 10
      };
    },
    results: function(data, page) {
      return {
        results: data, more: ????
      };
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何发出异步请求(我发出跨域请求,并且文档说在这种情况下不支持async)并等待它返回结果回调之前完成.

select2页面的示例如下:

results: function (data, page) {
  var more = (page * 10) < data.total; // whether or not there are more results available
  // notice we return the value of more so Select2 knows if more results can be loaded
  return {results: data.movies, more: more};
}
Run Code Online (Sandbox Code Playgroud)

问题是我的Web服务返回来自不同端点的记录总数,所以我必须发出另一个请求,如下所示:http:// localhost:9000/api/countries?filter = term

任何的想法?

jfr*_*d00 8

你不能等待javascript中的异步回调.您必须重新构建代码,以根据实际回调的异步响应执行所有未来的工作.

如果你需要进行多个连续的ajax调用,那么你发出第一个ajax调用,在第一个ajax调用的成功处理程序或响应处理程序中,你发出第二个ajax调用,在第二个调用处理器中,你执行任何调用你想要做的数据.

如果看到你正在使用.select2()框架.在框架中,结果回调是ajax调用返回的位置.在那个函数中,您将使用普通的jQuery ajax调用发出第二个ajax调用,并且在第二个ajax调用的成功处理程序中,您将执行您尝试处理的最终数据.您将无法使用结果回调的正常返回值,因为在您需要返回时您将无法获得最终数据.我认为这只是一个限制.select2(),因为它只支持单个ajax调用.它只是意味着你不能使用一点内置行为,并且必须自己使用你自己的代码来应用结果,但这并不意味着你必须抛弃.select2()你使用它的其他一切.

看起来你可能只想change直接挂钩事件而不是使用他们内置的ajax东西,因为如果你需要两个序列化的ajax调用它看起来并不像它真的提供了很多东西.