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 });
}
})
//因為異步現(xiàn)在的data是[]
ctx.body = { data, success: this.success() }
如何解決此過程中多次循環(huán)異步操作帶來的問題
麻煩詳細說下 謝謝
forEach不適合接收這種回調(diào)函數(shù)。async函數(shù)返回的是Promise,所以你可以用map得到一個Promise的數(shù)組。 你可以promises= paramArr.map(async (val, i) => ...。
然后使用await Promise.all(promises)。
我再看了下你的代碼,data.push({ 'a': result[item].a, 'b': result[item].b });在這里的順序是不確定的,這樣的話data的順序就會有問題了,你或者可以使用for循環(huán)放棄并發(fā)請求,或者可以最后對data進行排序獲得和原來一樣的順序(每次push的時候同時存入索引i,用來排序)。
當然如果data.push不立即處理,而是讓Promise返回結(jié)果,那么Promise.all就是有序的,然后再存放到data里。
不要用forEach,直接for循環(huán)就行,也沒必要呀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))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);
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');
});
//因為異步現(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)聽風格的
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。