await
await allows us to wait for the response of an asynchronous request.
The await keyword before a promise makes JavaScript wait until that promise settles, and then:
1.If it’s an error, the exception is generated, same as if throw error were called at that very place.
2.Otherwise, it returns the result, so we can assign it to a value.
async/await allows us to program using asynchronous requests in a "synchronous" manner using the modern versions of Javascript.
为什么要用await:为了使异步代码,更像同步的代码
解决了什么问题
在async/await之前,有三种方式写异步代码
1.嵌套回调
2.以Promise为主的链式回调
3.使用Generators
但这三种写起来都不够优雅,ES7做了优化改进,async/await应运而生。
相比较Promise对象then函数的嵌套,与Generator 执行的繁琐(需要借助co才能自动执行,否则得手动调用next方法),Async/Await可以轻松写出同步风格的代码同时又拥有异步机制,更加简洁,逻辑更加清晰。
await等到之后,做了一件什么事情?
右侧表达式的结果,就是await要等的东西。
等到之后分2个情况
1.不是promise对象
如果不是promise,await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,把这个非promise的东西,作为await表达式的结果。
2.是promise对象
如果它等到的是一个promise对象,await也会暂停后面的代码,先执行async外面的同步代码,等着Promise对象fulfilled,然后把resolve的参数作为await表达式的运算结果。
如果asycn里的代码都是同步的,那么这个函数被调用就会同步执行
1)await对于结果的处理:await是个运算符,用于组成表达式,await表达式的运算结果取决于它等的东西。
1.如果它等到的不是一个Promise对象,那么await表达式的运算结果就是它等到的东西;
2.如果它等到的是一个Promise对象,await就忙起来了,它会阻塞其后面的代码,等着Promise对象resolve,然后得到resolve的值,作为await表达式的运算结果。
虽然是阻塞,但async函数调用并不会造成阻塞,它内部所有的阻塞都被封装在一个Promise对象中异步执行,这也正是await必须用在async函数中的原因;
2)await对于失败消息的处理:await只关心异步过程成功的消息resolve(data),拿到相应的数据data;至于失败消息reject(error),不关心不处理;
对于错误的处理有以下几种方法供选择:
(1)让await后面的Promise对象自己catch;
(2)也可以让外面的async函数返回的Promise对象统一catch;
(3)像同步代码一样,放在一个try...catch结构中;
//这是React Native的回调函数,加个async关键字没有任何影响,但是可以用await关键字
将异步和同步的代码放在一个try..catch中,异常都能抓到
async componentDidMount(){
try{
let array=null;
//这里用await关键字,就能拿到结果值;没有await的话,只能拿到Promise对象
let data=await asyncFunction();
if(array.length>0){
array.push(data); //这里会抛出异常,下面的catch也能抓到
}
}catch(error){
alert(JSON.stringify(error))
}
}
await内部的原理?
当执行await语句时,线程,cpu,内存都发生了什么。
await发生异常了还能不能继续往下执行
await如何捕获异常