anync关键字
- 普通函数定义前加async关键字普通函数变成异步函数
- 异步函数默认返回promise对象
- 在异步函数内部使用return关键字进行结果返回结果会被包裹的promise对象中return关键字代替 了resolve方法
- 在异步函数内部使用throw关键字抛出程序异常
- 调用异步函数再链式调用then方法获取异步函数执行结果
- 调用异步函数再链式调用catch方法获取异步函数执行的错误信息
async function
用来定义一个返回 AsyncFunction
对象的异步函数。异步函数是指通过事件循环异步执行的函数,它会通过一个隐式的 Promise
返回其结果。如果你在代码中使用了异步函数,就会发现它的语法和结构会更像是标准的同步函数。
await关键字
- await关键字只能出现在异步函数中
- await promise await后面只能写promise对象其他类型的API是不不可以的
- await关键字可是暂停异步函数向下执行直到promise返回结果
await 表达式会暂停当前 async function
的执行,等待 Promise 处理完成。若 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,继续执行 async function
。
若 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出。
另外,如果 await 操作符后的表达式的值不是一个 Promise,则返回该值本身。
示例
node 依次读取文件内容
1 2 3 4 5 6 7 8 9 10 11 12
| const fs = require('fs');
fs.readFile('./1.txt', 'utf8', (err, result1) => { console.log(result1); fs.readFile('./2.txt', 'utf8', (err, result1) => { console.log(result1); fs.readFile('./3.txt', 'utf8', (err, result1) => { console.log(result1); }) }) });
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| const fs = require('fs');
function p1 () { return new Promise((resolve, reject) => { fs.readFile('./1.txt', 'utf8', (err, result) => { resolve(result) }) }) } function p2 () { return new Promise((resolve, reject) => { fs.readFile('./2.txt', 'utf8', (err, result) => { resolve(result) }) }) } function p3 () { return new Promise((resolve, reject) => { fs.readFile('./3.txt', 'utf8', (err, result) => { resolve(result) }) }) }
p1().then((r1) => { console.log(r1); return p2() }) .then((r2) => { console.log(r2); return p3() }) .then((r3) => { console.log(r3); })
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const fs = require('fs');
const promisify = require('util').promisify;
const readFile = promisify(fs.readFile);
async function run () { let r1 = await readFile('./1.txt', 'utf8') let r2 = await readFile('./2.txt', 'utf8') let r3 = await readFile('./3.txt', 'utf8') console.log(r1); console.log(r2); console.log(r3); } run();
|