多层回调嵌套,回调后拿到结果再执行下文

多层回调嵌套,并且嵌套上层循环里,如此最后的方法必须等之前的回调都执行完了才能执行,如此同步的代码,应该怎么弄呢?求大神指点!!

function a() {
  var j = [a, b, c, d, e] b(j)
}
function b(j) {
  j.each(function(item) {
    $.ajax({
      url: '/web/sendsms',
      data: {
        key: item
      },
      traditional: true,
      success: function(data) {
        if (data && data.code !== 700) {
          c(data)
        }
      }
    });
  })
}
function c(data) {
  var datas = [] $.ajax({
    url: '/web/sendsms/name',
    data: {
      name: data.key
    },
    traditional: true,
    success: function(data) {
      if (data && data.code !== 700) {
        datas.push(data)
      }
    }
  });
  return datas
}
function d() {
  //拿到总的数据,就是所有循环获取到的datas的数组,然后去重,所以这个方法只能在上面都拿到数据后才能执行,并且不能作为 c 方法的回调函数,因为c嵌套了2层循环。
}
阅读 4.8k
6 个回答

promise是好用的,我用promise改造了下你的代码
reject 的情况没考虑,你再改改吧

function getFirst(item) {
  return new Promise(function (resolve, reject) {
    $.ajax({
      url: '/web/sendsms',
      data: {
        key: item
      },
      traditional: true,
      success: function (data) {
        if (data && data.code !== 700) {
          resolve(getSecond(data));
        }
      }
    });
  })
}

function getSecond(item) {
  return new Promise(function (resolve, reject) {
    $.ajax({
      url: '/web/sendsms/name',
      data: {
        name: item.key
      },
      traditional: true,
      success: function (data) {
        if (data && data.code !== 700) {
          resolve(data)
        }
      }
    });
  }
}

var promises = ['a', 'b', 'c', 'd', 'e'].map(function (item) {
  return getFirst(item);
});

Promise.all(promises).then(function (datas) {
  console.log(datas)
}).catch(function (reason) {
  // 这里没写 reject,自己试着写一下吧
});

ES6的promise,ES8的async都适合解决此类问题。jquery有一个deferred对象也是解决这类问题的

可以用promise 中的promise.all
在node.js 中还可以用 async.parallel(async 是一个npm) 这个api

优雅的写法是用Promise机制,前面的同学已经回答过,直观的写法可以加个计数器之类的变量,执行回调时判断计数器,如果数量是全部都执行了就执行最后的回调。

这个.done 是一个异步的回调 jq自身提供的

$.ajax({    
  type:'post'
  xxx
}).done(function(res){
 //
})

方案还在研究中,待编辑……

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题