JavaScript箭头函数在代码跟踪后执行

JavaScript箭头函数在代码跟踪后执行,javascript,arrow-functions,Javascript,Arrow Functions,我在JavaScript中遇到了箭头函数的意外行为 microsoftTeams.initialize(); microsoftTeams.getContext((context) => { this.user = context.loginHint!; console.log("Arrow function called"); }); console.log("Outside of Arrow Function"); 在React组件的构

我在JavaScript中遇到了箭头函数的意外行为

microsoftTeams.initialize();
microsoftTeams.getContext((context) => {
  this.user = context.loginHint!;
  console.log("Arrow function called");
});
console.log("Outside of Arrow Function");
在React组件的构造函数中执行此代码时,arrow函数中包含的代码块是最后一个要调用的代码块。甚至在构造完成后调用的函数,如
componentDidMount()
,也会更早调用:

FetchFiles.tsx:21 Outside of Arrow Function
FetchFiles.tsx:28 Component did mount
FetchFiles.tsx:19 Arrow function called
我想知道为什么不先执行所附的代码块。这是预期的行为吗?如果是,我在这里遗漏了什么

我想知道为什么不先执行所附的代码块

它何时运行完全取决于
getContext
。显然,它是异步调用回调的,这就是回调中的代码比
getContext
调用后面的代码运行得晚的原因

回调可以同步调用(如数组
sort
map
中的回调,或字符串
replace
)或异步调用(如promise
then
catch
中的回调,或
setTimeout
中的回调)。这完全取决于回调提供给什么


在本例中,它确实异步调用回调,但遗憾的是,它没有明确说明这一点(在文档的这一小部分中)。
getContext
接受回调而不仅仅返回上下文,这一事实强烈暗示了这一点。如果可以同步检索它,您会期望它作为返回值提供,而不是通过回调。(当文档说
回调
是“检索xref:Context对象时要调用的回调”时,也暗示了这一点。”

“这是预期的行为吗”-是的。“如果是这样,我在这里缺少了什么?”——
.getContext()
是异步的。遗憾的是,术语“回调”已经过载,意味着
.map
样式的同步函数和异步的“稍后调用的内容”:(@Alnitak-我不记得在我30多年的时间里,这两种东西都没有使用过它。如果有单独的术语,那真的很好,但是……谢谢,我对语法有点陌生,还不知道异步回调。我有没有办法强制它在这里同步运行?(如
wait
关键字)?