await和async
a w a i t await await在等啥? a w a i t await await到底阻不阻塞?不阻塞主线程,那是怎么保证能拿到请求数据的? a s y n c async async返回是啥?那下面两段代码使用 a w a i t await await一样吗?
async function print(){return new Promise((resolve)=>{setTimeout(()=>{console.log("middle"); resolve()},3000) })
}
和
async function print(){ setTimeout(()=>{console.log("middle"); resolve()},3000)
}
你要是能正确完整回答完上面的问题,那就不耽误大佬时间了~
下面依次来回答上面的问题吧。
- a s y n c async async返回的是什么?
有同学会答,返回 p r o m i s e promise promise!那好的,看这个代码,这段代码的返回值实际上是Promise.resolve(undefined)
,因为原生异步 A P I API API(如 s e t T i m e o u t setTimeout setTimeout、 a d d E v e n t L i s t e n e r addEventListener addEventListener)不会自动返回 P r o m i s e Promise Promise,必须手动用 n e w P r o m i s e new\ Promise new Promise 包装。
async function print(){ setTimeout(()=>{console.log("middle"); resolve()},3000)
}
2. a w a i t await await的阻塞问题,看这个代码:
async function taskA() {console.log("A1");await delay(2000); // 等待2秒console.log("A2");
}
async function taskB() {console.log("B1");await delay(1000); // 等待1秒console.log("B2");
}
// 同时启动两个任务
taskA();
taskB();
这段代码里面 t a s k A taskA taskA和 t a s k B taskB taskB的执行不分先后,这是所谓的不阻塞线程,也就是函数里的 a w a i t await await没阻塞到外面的。函数里的 a w a i t await await依旧具有阻塞的特点。
3. 用了 a w a i t await await之后,后面的代码都会被包成.then
里面的东西。并且阻塞后面的东西继续执行