鍍金池/ 問(wèn)答/HTML5  HTML/ 如何解決循環(huán)中的http請(qǐng)求的異步問(wèn)題

如何解決循環(huán)中的http請(qǐng)求的異步問(wèn)題

    let paramArr = JSON.parse(paramArray)
    let data = [];
    paramArr.forEach(async (val, i) => {
      let easywlb = dasign ? tqyybm : (tqyybm.substr(0, 2) === '02' ? ('12' + tqyybm.substr(2, 4)) : ('11' + tqyybm.substr(2, 4)));
      let param = { '這是一些參數(shù)' };
      await this.post('這是接口', param);
      let result = this.get('data');
      
      for (let item in result) {
        data.push({ 'a': result[item].a, 'b': result[item].b });
      }
    })
    //因?yàn)楫惒浆F(xiàn)在的data是[]
    ctx.body = { data, success: this.success() }
    

如何解決此過(guò)程中多次循環(huán)異步操作帶來(lái)的問(wèn)題
麻煩詳細(xì)說(shuō)下 謝謝

回答
編輯回答
笨小蛋

forEach不適合接收這種回調(diào)函數(shù)。
async函數(shù)返回的是Promise,所以你可以用map得到一個(gè)Promise的數(shù)組。 你可以promises= paramArr.map(async (val, i) => ...。
然后使用await Promise.all(promises)。


我再看了下你的代碼,data.push({ 'a': result[item].a, 'b': result[item].b });在這里的順序是不確定的,這樣的話data的順序就會(huì)有問(wèn)題了,你或者可以使用for循環(huán)放棄并發(fā)請(qǐng)求,或者可以最后對(duì)data進(jìn)行排序獲得和原來(lái)一樣的順序(每次push的時(shí)候同時(shí)存入索引i,用來(lái)排序)。


當(dāng)然如果data.push不立即處理,而是讓Promise返回結(jié)果,那么Promise.all就是有序的,然后再存放到data里。

2017年4月20日 12:55
編輯回答
胭脂淚

不要用forEach,直接for循環(huán)就行,也沒(méi)必要呀asnyc/await,既然this.post方法是promise,就直接promise調(diào)用就行

let paramArr = JSON.parse(paramArray)
let data = [];
let promiseArr = paramArr.map(val=>{
    let easywlb = dasign ? tqyybm : (tqyybm.substr(0, 2) === '02' ? ('12' + tqyybm.substr(2, 4)) : ('11' + tqyybm.substr(2, 4)));
    let param = { '這是一些參數(shù)' };
    return this.post('這是接口', param).then(()=>{
        let result = this.get('data');
        return result.map(n=>return {a:n.a, b:n.b}))
    })
});
promise.all(promiseArr)
    .then((resultArr)=>ctx.body = { data: data.reduce((p,c)=>[p.concat(c), p][1],[]), success: this.success() })
    .catch(err=>console.log(err))
2017年1月8日 19:55
編輯回答
傻丟丟
const paramArr = JSON.parse(paramArray).map(async(val)=>{
    let easywlb = dasign ? tqyybm : (tqyybm.substr(0, 2) === '02' ? ('12' + tqyybm.substr(2, 4)) : ('11' + tqyybm.substr(2, 4)));
    let param = { '這是一些參數(shù)' };
    await this.post('這是接口', param);
    let result = this.get('data');
    
    const map = [];
    for (let item in result) {
      map.push({ 'a': result[item].a, 'b': result[item].b });
    }
    return map;
});

const data = await Promise.all(paramArr);
2017年8月9日 03:00
編輯回答
墨染殤
const { EventEmitter } = require('events');

var event = new EventEmitter();

let paramArr = JSON.parse(paramArray);
let data = [];
paramArr.forEach(async (val, i) => {
    let easywlb = dasign
        ? tqyybm
        : tqyybm.substr(0, 2) === '02'
            ? '12' + tqyybm.substr(2, 4)
            : '11' + tqyybm.substr(2, 4);
    let param = {
        /* '這是一些參數(shù)' */
    };
    await this.post('這是接口', param);
    let result = this.get('data');
    for (let item in result) {
        data.push({ a: result[item].a, b: result[item].b });
    }
    event.emit('loaded');
});
//因?yàn)楫惒浆F(xiàn)在的data是[]
var count = 0;
event.on('loaded', function() {
    if (++count === paramArr.length) {
        event.emit('finish');
    }
});

event.on('finish', function() {
    ctx.body = { data, success: this.success() };
})

事件監(jiān)聽風(fēng)格的

2017年12月17日 18:35