async/await 是以更舒适的方式使用 promise 的一种特殊语法,同时它也非常易于理解和使用
async 这个关键字 它可以被放置在一个函数前面, 即这个函数总是返回一个 promise。
async function f() {
return 1;
}
//等同于 显式返回一个 promise
async function f() {
return Promise.resolve(1);
}
//等同于
function f(){
return new Promise((resove, reject)=>{
resove(1)
})
}
/*
Promise {<fulfilled>: 1}
[[Prototype]]: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: 1
*/
await
只在 async 函数内工作,关键字 await
让 JavaScript 引擎等待直到 promise 完成(settle)并返回结果。
相比于 promise.then,它只是获取 promise 的结果的一个更优雅的语法。并且也更易于读写。
async function loadJson(url) {
const resove = await fetch(url)
if(resove.status == 200){
return resove.json();
}else{
throw new Error(resove.status);
}
}
error 错误处理
我们可以用 try..catch 来捕获async/await 的错误
async function f() {
try {
let response = await fetch('http://no-such-url');
} catch(err) {
alert(err); // TypeError: failed to fetch
}
}
f();
如果我们没有 try..catch, 那么由异步函数 f() 的调用生成的 promise 将变为 rejected。我们可以在函数调用后面添加 .catch 来处理这个 error:
async function f() {
let response = await fetch('http://no-such-url');
}
// f() 变成了一个 rejected 的 promise
f().catch(alert); // TypeError: failed to fetch // (*)