不是应该所异步代码都在同步代码之后执行吗? 按照这个说法,
"===end1===
===end2==="这两句打印信息在 insertData函数之前被执行啊? insertData在这两句之后被执行才对啊。
async function openDb(): Promise<void> {
console.log('===openDb===');
}async function loadDb(): Promise<void> {
console.log('===loadDb===');
}
async function insertData(person: any): Promise<void> {
console.log('===enter into insertData===');
loadDb();
console.log('===await openDb===');
await openDb();
console.log('===after open===');
}console.log('===start===');
insertData({ name: "yika" });
console.log('===end1===');
console.log('===end2===');
以下是执行结果:===start===
===enter into insertData===
===loadDb===
===await openDb===
===openDb===
===end1===
===end2===
===after open===
"===end1===
===end2==="这两句打印信息在 insertData函数之前被执行啊? insertData在这两句之后被执行才对啊。
async function openDb(): Promise<void> {
console.log('===openDb===');
}async function loadDb(): Promise<void> {
console.log('===loadDb===');
}
async function insertData(person: any): Promise<void> {
console.log('===enter into insertData===');
loadDb();
console.log('===await openDb===');
await openDb();
console.log('===after open===');
}console.log('===start===');
insertData({ name: "yika" });
console.log('===end1===');
console.log('===end2===');
以下是执行结果:===start===
===enter into insertData===
===loadDb===
===await openDb===
===openDb===
===end1===
===end2===
===after open===
openDb和loadDb的不同就在于,一个使用了await,一个没有使用awati。
没有使用的依然在在主栈中,不进入异步队列,比如这3句红色的,async function insertData(person: any): Promise<void> {
console.log('===enter into insertData===');
loadDb();
console.log('===await openDb===');
await openDb();我这么理解对否? 很明显不对。我们看完整的代码: async function insertData(person: any): Promise<void> {
console.log('===enter into insertData===');
loadDb();
console.log('===await openDb===');
await openDb();
console.log('===after open===');
}console.log('===start===');
insertData({ name: "yika" });
console.log('===end1===');
console.log('===end2===');
===start===
===enter into insertData===
===loadDb===
===await openDb===
===openDb===
===end1===
===end2===
===after open===如果是await作用====》把函数插入到异步的尾部,按照你的说法,那么console.log('===after open==='); 就应该在主栈中,打印的结果就应该先是: after open, 后是end1, end2,而我们看到的结果却是“先end1, end2, 后after open”。
再来看这个问题,当函数执行到await openDb()时,此时promise进行实例化,所以会打印出openDb。由于使用了await,所以在openDb()后面的操作会暂时挂起。
然后主线程继续执行,打印出'end1', 'end2'。当openDb()的promise执行完成之后,再执行后面的代码,最后打印出'after open'。
请问 :await后,也就是 console.log('===after open==='); 这一句是同步调用还是异步调用?
你的理解是对的,在await之后,函数内的代码都会被挂起,要等待await的函数执行完成后才会执行。
async function index() {
console.log('第二个打印')
// 这里开始异步
var data = await new Promise() // data未异步返回值
// 下面接着可以使用data
console.log(data)
console.log('第四个打印')
}
console.log('第一个打印')
index()
console.log('第三个打印')