为了账号安全,请及时绑定邮箱和手机立即绑定

es6中一个function内的循环,循环里有异步,怎么让最终的结果被return

es6中一个function内的循环,循环里有异步,怎么让最终的结果被return

蝴蝶刀刀 2019-03-15 18:15:42
问题描述es6中一个function内的循环,循环里有异步,怎么让最终的结果被return,在循环外return不是想要的结果问题出现的环境背景及自己尝试过哪些方法用vue2开发的web项目,Promise和async/await都有个问题就是循环内得到的是promise对象,无法在循环外return想要的结果相关代码// 请把代码文本粘贴到下方(请勿用图片代替代码)async _normalizeSongs(list) {        if(!list) {            return        }        let rest = []        let index = 1        console.log(list)        for(let i=0;i<list.length;i++) {            if(list[i].songid && list[i].albummid) {                let res = await getSongVkey(list[i].songmid)                if(res.code === ERR_OK) {                    const filename = res.req_0.data.midurlinfo[0].filename                    const vkey = res.req_0.data.midurlinfo[0].vkey                    const newSong = createSong(list[i], filename, vkey)                    // console.log(newSong)                    rest.push(newSong)                }            }            index++        }        return rest   }         _genResult(data) {        let rest = []        if(data.zhida && data.zhida.singername) {            rest.push({...data.zhida,...{type: TYPE_SINGER}})        }        if(data.song) {            let promise = this._normalizeSongs(data.song.list)            promise.then((res) => {                console.log(res)               /* rest = rest.concat(res)                this.result = rest*/                rest = rest.concat(this._normalizeSongs(data.song.list))            })        }        console.log(rest)        return rest    }你期待的结果是什么?实际看到的错误信息又是什么?_genResult这个函数里promise里的res怎么return出这个函数,路过的道友们给看看,万分感谢
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

这个函数的第二个参数为回调函数(调用的时候写匿名函数就行了,手机回答没办法给你写代码)


这个回调函数的参数就是你要return的对象 。


调用大概是这样 gen(data,(res)=>{console.log(res)})


函数 在修改后面加个cb&&cb(rest)


-----补充


函数修改


 _genResult(data,cb) {

        let rest = []

        if(data.zhida && data.zhida.singername) {

            rest.push({...data.zhida,...{type: TYPE_SINGER}})

        }

        if(data.song) {

            let promise = this._normalizeSongs(data.song.list)

            promise.then((res) => {

                console.log(res)

               /* rest = rest.concat(res)

                this.result = rest*/

                rest = rest.concat(this._normalizeSongs(data.song.list))

                cb&&cb(rest);

            })


        }

    }

    

    //调用

    this._genResult(data, (rest) => {

        console.log(rest);//

        this._genResult = rest; //建议你换个名字来接收这个函数

     });


查看完整回答
反对 回复 2019-04-14
?
烙印99

TA贡献1829条经验 获得超13个赞

Promise.all() 了解一下。

const results = Promise.all(list.map(item => getSongVkey(item.songmid)))// results 是一个数组

注: 你的 getSongVkey 方法应该返回的是一个 Promise对象.
参考如下:

MDN

let p1 = new Promise((resolve, reject) => {

  resolve('成功了')

})


let p2 = new Promise((resolve, reject) => {

  resolve('success')

})


Promise.all([p1, p2]).then(results => {

  console.log(results)

}).catch(error => {

  console.log(error)

})


查看完整回答
反对 回复 2019-04-14
  • 2 回答
  • 0 关注
  • 498 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信