赵小帅go 2021-07-04 09:33 采纳率: 50%
浏览 131
已采纳

js 循环含有异步操作,如何保证循环中的所有异步操作都执行完之后,再执行循环之外的部分?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<script type="text/javascript">
    function queue(num){
        return new Promise(resolve=>{
            resolve();
        }).then(
            value=>{
                let promise=Promise.resolve();
                num.map(v=>{
                    promise=promise.then(_=>{
                        return new Promise(resolve=>{
                            //异步操作
                            setTimeout(() => {
                                console.log(v);
                                resolve();
                            }, 1000);
                        })
                    })
                })
            }
        )
    }
    new Promise(resolve=>{
        resolve();
    }).then(
        _=>{
            let num=[1,2,3,4,5];
            return Promise.resolve(num);
        }
    ).then(
        value=>{
            queue(value);
        }
    ).then(
        value=>{
            console.log("完成");
        }
    )
 
</script>   
</body>
</html>

问题:
如何将queue函数中的所有异步操作(每隔1s按顺序打印1个数字)都执行完之后,再执行最后的then方法,打印"完成"?
说明:
效果是每隔1s打印15结束之后,再打印"完成"
最好不要通过嵌套的方法,因为这只是一个小例子,真实情况下,循环外的部分还有很复杂的逻辑结构
最好不要通过修改计时器的方法,因为这里的计时器只是代表一个异步操作,真实情况下,异步操作可能是很复杂的
回答形式:
最好能在我的例子上修改,贴出修改后的代码和执行效果,我验证后会给与采纳,谢谢

  • 写回答

6条回答 默认 最新

  • 冬树叶 2021-07-04 11:32
    关注

    let num = [1, 2, 3, 4, 5];
    let i=0;
    function queue(){
    new Promise(function (resolve, reject) {
    num.map(function (value, index) {
    setTimeout(function () {
    console.log(value);
    }, 1000乘以i);
    i++;
    })
    setTimeout(() => {
    resolve();
    }, 1000乘以(i-1));

    }).then(function (resolve) {
    console.log("完成");
    })
    }
    queue();
    乘号打不上换一下,这样即可

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?