鍍金池/ 問答/HTML/ forEach()內(nèi)使用異步函數(shù),此函數(shù)需要item的其中一個屬性(mid)作為

forEach()內(nèi)使用異步函數(shù),此函數(shù)需要item的其中一個屬性(mid)作為jsonp參數(shù)來異步獲取數(shù)據(jù),應(yīng)該怎么做?

RT,list包含100首歌曲,現(xiàn)在對它進(jìn)行遍歷,拿到每首歌曲的mid,作為getSongvkey(jsonp)參數(shù)來異步獲取vkey值,再通過creatSong方法將vkey作為屬性添加至歌曲上,這個vkey值需要用來獲取歌曲的播放鏈接。

現(xiàn)在的問題是因為數(shù)據(jù)是異步獲取的,我按以下代碼在forEach遍歷的時候,只能拿到最后一個item的vkey,如何每遍歷一個item就獲取它的mid然后異步獲取其vkey返回,再處理下一個item?

_normalizeSongs(list) {
  let ret = []
  list.forEach((item) => {
    let { musicData } = item
    if (musicData.songid && musicData.songmid && musicData.albummid) {
      getSongvkey(musicData.songmid).then(res => {
        if (res.code === ERR_OK) {
          let vkey = res.data.items[0].vkey
          ret.push(creatSong(musicData, vkey))
        }
      })
    }
  }
  return ret
}  
回答
編輯回答
耍太極

async/await了解一下,這個寫法看起來挺像同步的。遇到異步的地方會堵塞,一直到異步方法執(zhí)行完成才會繼續(xù)往下執(zhí)行,達(dá)到類似同步執(zhí)行的效果。
用法很簡單,百度幾個例子看一下就明白了

2018年5月9日 07:00
編輯回答
柒槿年

Promise.all了解一下

2017年9月7日 23:11
編輯回答
伴謊

_normalizeSongs(list) {
let ret = []
list.forEach((item) => {

let { musicData } = item
if (musicData.songid && musicData.songmid && musicData.albummid) {
    (function(mid){
        getSongvkey(mid).then(res => {
            if (res.code === ERR_OK) {
              let vkey = res.data.items[0].vkey
              ret.push(creatSong(musicData, vkey))
            }
            if(ret.length == list.length){
                return ret
            }
          })
    })(musicData.songmid)
}

}
}

2017年6月9日 18:29
編輯回答
疚幼

舉個栗子,如何執(zhí)行完一個promise回調(diào)再到下一個

function P(val) {//promise 生成器
    return new Promise((reslove) => {
        setTimeout(() => {
            reslove(val)
        }, Math.random() * 1000)
    })
}

let arr = [1, 2, 3, 4, 8];

arr.map(v => P(v)).reduce((prev, curr) => {
    return prev.then(() => curr.then((val) => {
        console.log('one by one', val)
    }))
}, Promise.resolve())
2017年5月14日 00:36
編輯回答
伐木累

你可以使用async函數(shù) es6語法,或者用生成器函數(shù)。或者用promise,或者回掉封裝

2018年7月10日 07:50