Javascript 是否可以实现同步使用非阻塞setTimeout的函数?

Javascript 是否可以实现同步使用非阻塞setTimeout的函数?,javascript,asynchronous,iif,Javascript,Asynchronous,Iif,我想知道是否有可能将这2个IIF同步地称为它们在最后产生的类似的东西 ###### ##### #### ### ## # # ## ### #### ##### ###### ? 下面的功能不会延迟控制台日志。其思想是通过一行一行的延迟来控制日志 (function whileLoop(n) { setTimeout(function () { let hashArr = Array.apply(null, Array(n)).map(() =&g

我想知道是否有可能将这2个IIF同步地称为它们在最后产生的类似的东西

######
#####
####
###
##
#
#
##
###
####
#####
###### ? 
下面的功能不会延迟控制台日志。其思想是通过一行一行的延迟来控制日志

 (function whileLoop(n) {
        setTimeout(function () {
            let hashArr = Array.apply(null, Array(n)).map(() => {
                return hashSymbol
            });
            console.log(hashArr);
            if (--n) whileLoop(n);
        }, 2000)
    })(6);

    (function whileLoop(n, m) {
        setTimeout(function () {
            let hashArr = Array.apply(null, Array(n)).map(() => {
                return hashSymbol
            });
            console.log(hashArr);
            if (n < m) {
                ++n;
                whileLoop(n, m);
            }
        }, 2000)
    })(1, 6);
(函数whileLoop(n){
setTimeout(函数(){
让hashArr=Array.apply(null,数组(n)).map(()=>{
返回哈希符号
});
console.log(hashArr);
if(-n)whileLoop(n);
}, 2000)
})(6);
(函数whileLoop(n,m){
setTimeout(函数(){
让hashArr=Array.apply(null,数组(n)).map(()=>{
返回哈希符号
});
console.log(hashArr);
if(n处理两个不同异步操作的执行顺序的典型方法是使用承诺

var d=$.Deferred();
(函数whileLoop(n){
setTimeout(函数(){
让hashArr=Array.apply(null,数组(n)).map(()=>{
返回“#”
});
console.log(hashArr);
if(-n)whileLoop(n);
否则d.解决();
}, 2000)
})(6);
d、 然后(函数(){
(函数whileLoop(n,m){
setTimeout(函数(){
让hashArr=Array.apply(null,数组(n)).map(()=>{
返回“#”
});
console.log(hashArr);
if(n

为了让您逐个显示它,您需要使用
async
wait
。 请检查这里:

const行=6;
(异步()=>{
for(设r=1;r=7?(r%6):行-r)+1));
}
})();
函数displaysync(str){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
console.log(str);
解析(空);
}, 1000);
});

}
你就快到了。我知道您理解对
setTimeout
的递归调用异步模拟while循环。我发现您了解如何决定何时继续“循环”以及何时停止:

if (--n) whileLoop(n);
您只需要意识到当
if
条件为false时循环结束。因此,要运行第二个while循环,只需在
else
中启动它:

if (--n) {
    whileLoop(n);
}
else {
    whileLoop2(1,6);
}
这会产生一些影响:

  • 第二个
    whileLoop
    必须重新写入而不是作为一个生命-它必须是在第一个
    whileLoop
    结束时调用的常规函数,如上所述

  • 不能对这两个函数重复使用名称
    whileLoop
    。要区分函数,必须重命名第一个或第二个“循环”函数


  • 这保留了您当前的逻辑,只需要更改4行即可获得所需的行为。

    您的意思是一行接一行?有很多方法可以实现所需的操作,但基本上您有两种选择:1。在第一个函数完成后,使用带有回调函数的承诺或某个实现来调用第二个函数。2.在两个函数的作用域中使用一个变量来设置第二个函数的启动条件。如果没有关于约束的更具体的信息,就很难更加准确。