Javascript 完成异步循环后调用函数

Javascript 完成异步循环后调用函数,javascript,jquery,ajax,Javascript,Jquery,Ajax,例如,我们有以下代码: var data = [obj, obj, obj]; function handler(k, v) { ... check(v, function() {}); } function check(params, callback) { ... request(options, callback); } function request(opts, callback) { $.ajax({ ... opts ...

例如,我们有以下代码:

var data = [obj, obj, obj];

function handler(k, v) {
  ...
  check(v, function() {});
}

function check(params, callback) {
  ...
  request(options, callback);
}

function request(opts, callback) {
  $.ajax({
    ...
    opts
    ...
    callback
  });
}

$.each(data, handler);
我们如何等待完成
$。每个
调用一些函数?例如,有些东西看起来像:

$.when($.each(data, handler)).then(alert(1));
我找不到解决办法

另外,我们无法知道数据的长度


另外,这不是重复的,因为代码使用承诺或其他漂亮的东西来道歉

我建议查看库并开始使用承诺来解决这个问题。您还可以在前一个回调中包含每个回调,从而创建第一个回调

您需要返回jqXHR对象,并使用
$将它们堆叠在一个数组中。map

var data = [obj, obj, obj];

function handler(v, i) {
  ...
  return check(v, function() {});
}

function check(params, callback) {
  ...
  return request(options, callback);
}

function request(opts, callback) {
  return $.ajax({
    ...
    opts
    ...
    callback
  });
}

$.when($.map(data, handler)).then(function(){

  });

可能重复Nice解决方案,但对我不起作用:执行后无法获得新变量的结果我不知道“无法获得新变量的结果”是什么意思。是否要获得每个延迟对象的解析值?它们是
then
处理程序中
参数
对象的一部分。哦,糟糕,看:
函数处理程序
有一个所有结果的数组,当我使用
$时。然后(function(){console.log(array of results)}
它是空的,因为它是在环井结束之前执行的,听起来这是省略代码的一部分,也是另一种错误(可能您的结果不是全局性的)。您不应该以这种方式处理结果,就像我之前所说的,您需要从
然后
处理程序中的arguments对象中获取它们。