鍍金池/ 問答/HTML/ js 在同步的方法中并發(fā)多條ajax的問題?

js 在同步的方法中并發(fā)多條ajax的問題?

async getData() {
      await this.Arr.forEach(async val => {
        let obj = {};
        let itemBody = {key:val}
        let data = await post(this.dataUrl, itemBody, this.header);
        console.log(data);
        if (data.result) {
          obj[val] = data.result.res;
          closeAry.push(obj);
        }
      });
      this.closeAry = closeAry;
      let setKey = this.getStorageKey()
      wx.setStorageSync(setKey.toString(), closeAry)
    }

Arr 數(shù)組對應(yīng)的是15條接口,本來想同步執(zhí)行每個ajax,但是太慢。怎樣讓并發(fā)請求數(shù)據(jù),返回結(jié)果在closeAry的順序和Arr順序?qū)?yīng)?

回答
編輯回答
淚染裳

每個請求都放到promise中,這樣就構(gòu)成了一個包含15個promise的數(shù)組,使用Promise.all(promise數(shù)組)并發(fā)執(zhí)行,然后then取出數(shù)據(jù)。

最終效果圖大概這個樣子,示意,可能有bug

async getData() {
  let promises = [];
  this.Arr.forEach(val => {
      promises.push(new Promise(resolve, reject) {
        let obj = {};
        let itemBody = {key:val}
        post(this.dataUrl, itemBody, this.header)
          .then(data=>resolve({[val]:data.result.res}))
          .catch(reject);
      });
  });

  let closeAry = await Promise.all(promises);

  this.closeAry = closeAry;
  let setKey = this.getStorageKey();
  wx.setStorageSync(setKey.toString(), closeAry);
}
2018年3月14日 00:50