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

请问在foreach里面进行异步操作,怎么返回异步操作后的数据?

请问在foreach里面进行异步操作,怎么返回异步操作后的数据?

饮歌长啸 2019-03-14 14:15:30
代码如下:function longTimeDo() {    let data = [];    let sourse = [1,2,3,4,5];    sourse.forEach(value=>{        setTimeout(()=>{            data.push(value);        },1000);    });    //?怎么返回这个异步完成的data}
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

你可以用Promise.all或者for of加async/await。


function pushData(arr, value) {

    return new Promise((reslove) => {

        setTimeout(() => {

            arr.push(value);

            console.log('push data over', value)

            reslove();

        }, 1000);

    })

}


async function longTimeDo() {

    let data = [];

    let sourse = [1, 2, 3, 4, 5];


    for (let value of sourse) {

        await pushData(data, value);

    }


    console.log(data)


}


longTimeDo();


查看完整回答
反对 回复 2019-03-28
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

这样是不行的哦:


function longTimeDo() {

    let data = [];

    let sourse = [1,2,3,4,5];

    sourse.forEach(value => {

        console.log('forEach-star')

        setTimeout(() => {

            data.push(value);

            console.log('forEach-async')

        }, 1000);

        console.log('forEach-end')

    });

    console.log('longTimeDo-end');

}

longTimeDo();

输出结果为

https://img1.sycdn.imooc.com//5c9c64a700017cb501310225.jpg

从结果可以看到, 在循环中的异步只是会在循环中作用, 而不能影响循环外部. 如果你想让这个函数返回 异步后的结果的话 就相当于异步改同步, 就要用到Primise了


async function longTimeDo () {

    let data = [];

    let sourse = [1,2,3,4,5];

    let allP = sourse.map(value => {

        return new Promise((res, rej) => {

            setTimeout(() => {

                data.push(value+1);

                res(data)

            }, 1000);

        });

    });

    await Promise.all(allP);


    return data;

}

longTimeDo().then(res => {

    log(res) // [2, 3, 4, 5, 6]

})


查看完整回答
反对 回复 2019-03-28
  • 3 回答
  • 0 关注
  • 865 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号