async-await的循環請求數據

場景:循環按順序請求數組中的接口,之所以有這樣的需要是因爲我要請求一個接口,但是發送的是多個不同的參數,所以我就將參數放到一個數組中,想按照數組順序請求接口然後將返回數據放入數組中。
當前項目中用到的是ES6語法async-await,所以就想着將存放接口的數組遍歷循環請求一遍

  1. 首先想到的方法是用forEach+async-await循環遍歷數組的每一項然後請求接口,具體代碼如下:
	let arr = [],result
	this.tagKeyList.forEach(async item => {
        result = await leadsService({ tagKey: item })
        arr.push(result.data.data.tagKey)
        console.log(result.data.data.tagKey)  
     })
     console.log(arr)

leadsService是提前封裝好的ajax請求,括號內容爲請求參數,通過這種方式請求接口之後接口都正常請求了,但是這裏的arr數組輸出是空,並且是在接口內容返回之前就輸出了,也就是說這裏的async-await並沒有生效,
2.第二種方案是採用for-of+async-await循環遍歷數組具體的代碼內容如下:

	for (let item of this.tagKeyList) {
     	result = await leadsService({ tagKey: item })
        arr.push(result.data.data.tagKey)
        console.log(result.data.data.tagKey)     
	)}
	console.log(arr)

這種情況下的輸出順序就是按照接口數組請求數據進行輸出的,最後纔會輸出數組內容,可以達到我的需求
3.第三種思路是通過採用promise+async-await的方法操作,具體的實現代碼如下:

  const promises = tagKeyList.map(async (item) => 
    result = await leadsService({ tagKey: item })
  );
  await Promise.all(promises);
  console.log('Finished!');

這種方式可以實現等待所有接口請求完成之後再輸入請求的內容,但是Promise.all 方法會按照並行的模式,將所有請求一次性全部發送出去,然後等待接收到全部結果後,按照順序打印出來而已。它並不會按照順序發送一個請求,收到結果後再發送下一個請求。所以也不符合我所預想的結果。所以只有第二種for-of循環的方式符合我的需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章