Javascript 在异步函数中调用同步函数

Javascript 在异步函数中调用同步函数,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我在理解JavaScript中异步函数如何工作时遇到问题。让我们看下面的代码: async () => { console.log(1); setTimeout(() => console.log(2) , 2000) console.log(3); } 我希望在异步中调用同步函数应该在执行进一步的代码之前阻塞线程。所以我希望得到1->2->3而不是1->3->2。找不到发生这种情况的原因以及如何阻止线程接收输出的解释1->2->

我在理解JavaScript中异步函数如何工作时遇到问题。让我们看下面的代码:

async () => {
      console.log(1);
      setTimeout(() => console.log(2)
        , 2000)
      console.log(3);
}
我希望在异步中调用同步函数应该在执行进一步的代码之前阻塞线程。所以我希望得到
1->2->3
而不是
1->3->2
。找不到发生这种情况的原因以及如何阻止线程接收输出的解释
1->2->3

我正在将节点12与无服务器框架一起使用。

async
本身不会像您预期的那样等待
setTimeout
的执行完成。正如您可以从文档中看到的,请在此处查找:

异步函数可以包含一个等待表达式,该表达式暂停异步函数的执行以等待传递的承诺的解析,然后恢复
async
函数的执行并作为解析值进行计算

刚才构建了一个快速示例,以查看
async
wait
解决方案之间的区别,并使用示例中的
setTimeout

考虑以下示例:

const getPromise=async()=>{
返回新承诺((解决)=>{
setTimeout(解析,3000);
});
}
const run=async()=>{
log('run start');
setTimeout(()=>console.log('setTimeout finished'),2000);
log('setTimeout start');
const promise=wait getPromise();
console.log(“承诺已解决”);
log('runfinished');
}
run()
我希望在异步中调用同步函数应该在执行进一步的代码之前阻塞线程

是的

所以我希望得到1->2->3,而我得到的是1->3->2

setTimeout
不同步。它非常明确地用于排队等待函数在一段时间后运行

找不到发生这种情况的原因以及如何阻止线程接收输出1->2->3的解释

你自己不能

最接近的方法是将
setTimeout
替换为一个循环,该循环在循环中运行,直到一段时间过去……但这会很糟糕(它会为初学者锁定UI)

如果您只想按顺序运行这三个日志,那么将
setTimeout
替换为返回承诺的内容,然后
等待它(这将使异步函数休眠,并让任何其他代码继续运行,直到承诺得到解决)

const timeout=function(){
返回新承诺(功能(res){
设置超时(()=>{
控制台日志(2);
res();
}, 2000)
})
};
常量x=async()=>{
控制台日志(1);
等待超时();
控制台日志(3);
}

x()设置超时的唯一目的是在稍后时间做一些事情,因此是异步的。您给出的指令字面上是“打印
1
;2秒后打印
2
;打印
3
”,这正是您得到的-
1
->
3
->2秒等待->
2
。异步函数也是…异步的。因为在异步函数中调用了同步函数而停止线程也没有意义。你最好先阅读,然后问一个具体的问题。好吧,那是我的错。我认为setTimeout是同步的。我的实际问题是使用内部异步AWS lambda函数处理流。不知何故,当我在本地调用它时,一切正常,但在云中,它并没有等待流关闭。但这是另一个话题。谢谢你的时间