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)聽風(fēng)格的
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。