Javascript 同步执行和设置超时()

Javascript 同步执行和设置超时(),javascript,Javascript,我的目标是获得以下输出: 1,2(等待2秒)3,4(等待2秒)5,但我得到的是1,2,4(等待2秒)3,5 有人知道如何解决此问题吗? console.log(“1”); 控制台日志(“2”); setTimeout(function(){console.log(“3”)},2000); 控制台日志(“4”); setTimeout(function(){console.log(“5”)},2000) console.log(“1”); 控制台日志(“2”); setTimeout(函数(){

我的目标是获得以下输出:

1,2(等待2秒)3,4(等待2秒)5,但我得到的是1,2,4(等待2秒)3,5

有人知道如何解决此问题吗?

console.log(“1”);
控制台日志(“2”);
setTimeout(function(){console.log(“3”)},2000);
控制台日志(“4”);
setTimeout(function(){console.log(“5”)},2000)
console.log(“1”);
控制台日志(“2”);
setTimeout(函数(){
控制台日志(“3”);
控制台日志(“4”);
}, 2000);
setTimeout(function(){console.log(“5”)},4000)
console.log(“1”);
控制台日志(“2”);
setTimeout(函数(){
控制台日志(“3”);
控制台日志(“4”);
}, 2000);

setTimeout(function(){console.log(“5”)},4000)这是因为
setTimeout
是异步的。JS转到第一行,打印1,然后是第二行,打印2,然后是第三行-它是异步的,所以稍后将执行它(如您所说的2000毫秒),然后是第四行,打印4,第五行,在2000毫秒内执行(如第三行)。所以你会立即得到1,2和4,然后在3和5之后2000毫秒。要获取所需内容,请参阅下面的代码:

console.log(“1”)
控制台日志(“2”)
setTimeout(函数(){
控制台日志(“3”)
控制台日志(“4”)
}, 2000)
setTimeout(函数(){
控制台日志(“5”)

},4000)
这是因为
setTimeout
是异步的。JS转到第一行,打印1,然后是第二行,打印2,然后是第三行-它是异步的,所以稍后将执行它(如您所说的2000毫秒),然后是第四行,打印4,第五行,在2000毫秒内执行(如第三行)。所以你会立即得到1,2和4,然后在3和5之后2000毫秒。要获取所需内容,请参阅下面的代码:

console.log(“1”)
控制台日志(“2”)
setTimeout(函数(){
控制台日志(“3”)
控制台日志(“4”)
}, 2000)
setTimeout(函数(){
控制台日志(“5”)

},4000)
下面是一个使用
异步/await
的简单示例

function sleep(ms){返回新承诺(resolve=>setTimeout(resolve,ms));}
异步函数测试(){
控制台日志(“1”);
控制台日志(“2”);
等待睡眠(2000年);
控制台日志(“3”);
控制台日志(“4”);
等待睡眠(2000年);
控制台日志(“5”);
}

test()这里是一个使用
async/await
的简单示例

function sleep(ms){返回新承诺(resolve=>setTimeout(resolve,ms));}
异步函数测试(){
控制台日志(“1”);
控制台日志(“2”);
等待睡眠(2000年);
控制台日志(“3”);
控制台日志(“4”);
等待睡眠(2000年);
控制台日志(“5”);
}
test()您需要了解:

当您调用代码时,它会一直运行到完成,这意味着代码会一次性执行。set timeout的作用是将内部函数推送到事件循环,以便稍后执行。让我来评论一下发生了什么,请记住堆栈的执行模型是后进先出的。函数在执行return时将弹出堆栈:

//日志函数被推送到堆栈并弹出
控制台日志(“1”);
//另一个日志函数被推送到堆栈并弹出
控制台日志(“2”);
//setTimeout被推送到堆栈并弹出
//弹出时,它向事件循环添加了一个匿名函数
setTimeout(function(){console.log(“3”)},2000);
//另一个日志函数被推送到堆栈中
控制台日志(“4”);
//settimeout被推送到堆栈并弹出
//弹出时,它向事件循环添加了一个匿名函数
setTimeout(function(){console.log(“5”)},2000)您需要了解:

当您调用代码时,它会一直运行到完成,这意味着代码会一次性执行。set timeout的作用是将内部函数推送到事件循环,以便稍后执行。让我来评论一下发生了什么,请记住堆栈的执行模型是后进先出的。函数在执行return时将弹出堆栈:

//日志函数被推送到堆栈并弹出
控制台日志(“1”);
//另一个日志函数被推送到堆栈并弹出
控制台日志(“2”);
//setTimeout被推送到堆栈并弹出
//弹出时,它向事件循环添加了一个匿名函数
setTimeout(function(){console.log(“3”)},2000);
//另一个日志函数被推送到堆栈中
控制台日志(“4”);
//settimeout被推送到堆栈并弹出
//弹出时,它向事件循环添加了一个匿名函数

setTimeout(function(){console.log(“5”)},2000)异步/等待的最佳解释之一


异步/等待的最佳解释之一


你能用承诺来代替吗?这将使逻辑更容易理解。要补充,我还要说使用
async/await
这将使理解更容易。@Keith,这是我第一次使用听到承诺。我不知道如何在这个场景中使用它们。对不起,你能用承诺来代替吗?这将使逻辑更容易理解。要补充,我还要说使用
async/await
这将使理解更容易。@Keith,这是我第一次使用听到承诺。我不知道如何在这个场景中使用它们。很抱歉