鍍金池/ 問答/HTML/ 多層回調(diào)嵌套,回調(diào)后拿到結(jié)果再執(zhí)行下文

多層回調(diào)嵌套,回調(diào)后拿到結(jié)果再執(zhí)行下文

多層回調(diào)嵌套,并且嵌套上層循環(huán)里,如此最后的方法必須等之前的回調(diào)都執(zhí)行完了才能執(zhí)行,如此同步的代碼,應(yīng)該怎么弄呢?求大神指點(diǎn)??!

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() {
  //拿到總的數(shù)據(jù),就是所有循環(huán)獲取到的datas的數(shù)組,然后去重,所以這個方法只能在上面都拿到數(shù)據(jù)后才能執(zhí)行,并且不能作為 c 方法的回調(diào)函數(shù),因?yàn)閏嵌套了2層循環(huán)。
}
回答
編輯回答
脾氣硬

ES6的promise,ES8的async都適合解決此類問題。jquery有一個deferred對象也是解決這類問題的

2017年11月14日 03:18
編輯回答
拼未來

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,自己試著寫一下吧
});
2017年11月16日 16:51
編輯回答
近義詞

優(yōu)雅的寫法是用Promise機(jī)制,前面的同學(xué)已經(jīng)回答過,直觀的寫法可以加個計數(shù)器之類的變量,執(zhí)行回調(diào)時判斷計數(shù)器,如果數(shù)量是全部都執(zhí)行了就執(zhí)行最后的回調(diào)。

2018年3月7日 16:35
編輯回答
舊酒館

可以用promise 中的promise.all
在node.js 中還可以用 async.parallel(async 是一個npm) 這個api

2018年5月23日 03:18
編輯回答
玩控

方案還在研究中,待編輯……

2017年7月21日 05:28
編輯回答
賤人曾

這個.done 是一個異步的回調(diào) jq自身提供的

$.ajax({    
  type:'post'
  xxx
}).done(function(res){
 //
})
2017年4月2日 04:13