我对 Javascript 中的异步性概念非常陌生,我想确保我没有误解我正在阅读的内容。
在某些 Angular 应用程序中考虑这个伪代码:
async ngOnInit() {
this.responseObject = await this.myService.myGetRequest();
//do some more stuff down here
}
我的理解是 ngOnInit() 将在等待时“暂停”或停止执行,并且在返回承诺对象(数据)之前不会执行该行下面的代码?正确吗?
await
函数中使用的
async
等待 Promise
值的实现或将变量转换为 Promise
。
是的,您是正确的,直到使用
await
的上一行返回已完成的 Promise
或该值转换为 Promise
后,下一行的代码才会执行。
注意,目前尚不清楚图案是什么
await this.responseObject = await this.myService.myGetRequest();
预计可以实现。第一个
await
应该可以省略
this.responseObject = await this.myService.myGetRequest();
异步函数声明将返回一个 Promise,该 Promise 通过函数调用的返回值进行解析。
如果您添加await表达式,它将停止异步执行并等待您的承诺解决后再继续执行代码中的其他指令,以某种方式使其表现得像“同步”函数。
在这里阅读一些内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
我觉得上面两个答案没有回答核心问题。当 javascript 说正在等待某事时,这是什么意思? JavaScript 是单线程的。因此,它不是处理异步本身,而是在“运行时”(通常是浏览器或节点)提供的单独任务队列中运行所有任务。当我们等待一段代码时,我们将 Promise 放入任务队列中,等待 Promise 完成,然后将其从任务队列中取出以完成代码执行。例如,考虑以下代码块。
function delay(message, timeoutInMilliSeconds) {
return new Promise(resolve => {
setTimeout(() => {
console.log(message)
resolve('resolved');
}, timeoutInMilliSeconds)
});
}
delay("Finished Outer Timeout", 0)
async function asyncCall() {
console.log("Before Await")
delay("Finished Inner Timeout", 2000)
console.log(`After Await`);
}
asyncCall()
如果await只等待promise结束,我们期望的顺序是
外部超时被放置在任务队列中,主脚本运行直到await,等待内部超时,然后继续直到完成。
实际上的顺序是:
Javascript 不是等待承诺,而是改变主脚本或任务队列之间的控制权。 Await 指示运行时将任务队列负责,而不是简单地等待 Promise 解决。请注意,根据您的浏览器的不同,可能会有所不同,但这通常是 Javascript async/await 的工作原理。
被引用的作品: