- 内置执行期 co 函数封装到了 await 内部
- 更好的语义,更广的适应性
是什么
- async 用于声明一个 function 是异步的。
- 默认返回一个 fulfilled 状态的 value 为 undefined 的 Promise
- await 用于等待一个异步方法执行完成。
- 作用
- 他的作用是用同步的方式,执行异步操作。
async
async 函数会返回一个 Promise 对象,如果在函数中 return
一个直接量,async 会把这个直接量通过 Promise.resolve()
封装成 Promise 对象。
async function fn () {}
console.log(fn) // [AsyncFunction: fn]
console.log(fn()) // Promise {<fulfilled>: undefined}
可以看出,async
函数执行完会自动返回一个状态为fulfilled
的Promise
,也就是成功状态,但是值却是undefined,那要怎么才能使值不是undefined呢?很简单,函数有return返回值就行了
async function fn (num) {
return num
}
console.log(fn) // [AsyncFunction: fn]
console.log(fn(10)) // Promise {<fulfilled>: 10}
fn(10).then(res => console.log(res)) // 10
可以看出,此时就有值了,并且还能使用then方法进行输出
await
await 是在等待一个 async 函数完成。不过按语法说明,await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值
返回值一定是 promise 对象
- async 函数return的值会被隐式转换为promise对象,使用 Promise.resolve(xxx) 或 reject()
async function read(){
let value1 = await readFile('./name.txt','utf-8');
let value2 = await readFile(value1,'utf-8');
let value3 = await readFile(value2,'utf-8');
console.log('hello world');
return value3;
}
let promise = read()
promise.then((val) => {
console.log(val);
})
错误捕获
无错误
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
async function read(){
try {
let value = await readFile('./first.txt','utf-8');
console.log("await 拿到的value", value);
return 'async read 返回值'; // 走 resolve
} catch (err) {
console.log('try-catch捕获的错误', err);
return Promise.reject(err); // 走 reject
}
console.log('try-catch后边代码');
// try、catch中如果都return,上面一行代码就不执行了
}
let promise = read()
promise.then(val => {
console.log("then success:", val);
}, err => {
console.log('then fail', err)
})
console.log(1111)
有错误
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
async function read(){
try {
let value = await readFile('./first.tt','utf-8');
console.log("await 拿到的value", value);
return 'async read 返回值';
} catch (err) {
console.log('try-catch捕获的错误', err);
return Promise.reject(err); // 走 reject
}
}
let promise = read()
promise.then(val => {
console.log("then success:", val);
}, err => {
console.log('then fail', err)
})
console.log(1111)
try 或者 catch 不显式的 return 值,默认走 resolve
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
async function read(){
try {
let value = await readFile('./first.tt','utf-8');
console.log("await 拿到的value", value);
} catch (err) {
console.log('try-catch捕获的错误', err);
}
console.log('try-catch后边代码'); // 这里会执行
}
let promise = read()
promise.then(val => {
console.log("then success:", val);
}, err => {
console.log('then fail', err)
})
console.log(1111)
Comments NOTHING