async 函数是什么?一句话,async 函数就是 Generator 函数的语法糖。javascript
有一个 Generator 函数,依次读取两个文件。
var fs = require('fs'); var readFile = function (fileName){ return new Promise(function (resolve, reject){ fs.readFile(fileName, function(error, data){ if (error) reject(error); resolve(data); }); }); }; var gen = function* (){ var f1 = yield readFile('/etc/fstab'); var f2 = yield readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString()); };
写成 async 函数,就是下面这样。
var asyncReadFile = async function (){ var f1 = await readFile('/etc/fstab'); var f2 = await readFile('/etc/shells'); console.log(f1.toString()); console.log(f2.toString()); };
一比较就会发现,async 函数就是将 Generator 函数的星号(*)替换成 async,将 yield 替换成 await,仅此而已。
http://www.ruanyifeng.com/blo...
上面这一段是阮一峰老师的讲解。html
https://segmentfault.com/a/11...
详情就是边城大佬的透彻讲解java
await 命令后面的 Promise 对象,运行结果多是 rejected,因此最好把 await 命令放在 try...catch 代码块中。shell
async function myFunction() { try { await somethingThatReturnsAPromise(); } catch (err) { console.log(err); } } // 另外一种写法 async function myFunction() { await somethingThatReturnsAPromise().catch(function (err){ console.log(err); }); }
await 命令只能用在 async 函数之中,若是用在普通函数,就会报错。segmentfault
async function dbFuc(db) { let docs = [{}, {}, {}]; // 报错 docs.forEach(function (doc) { await db.post(doc); }); }
上面代码会报错,由于 await 用在普通函数之中了。可是,若是将 forEach 方法的参数改为 async 函数,也有问题。promise
async function dbFuc(db) { let docs = [{}, {}, {}]; // 可能获得错误结果 docs.forEach(async function (doc) { await db.post(doc); }); }
上面代码可能不会正常工做,缘由是这时三个 db.post 操做将是并发执行,也就是同时执行,而不是继发执行。正确的写法是采用 for 循环。并发
async function dbFuc(db) { let docs = [{}, {}, {}]; for (let doc of docs) { await db.post(doc); } }
若是确实但愿多个请求并发执行,能够使用 Promise.all 方法。async
async function dbFuc(db) { let docs = [{}, {}, {}]; let promises = docs.map((doc) => db.post(doc)); let results = await Promise.all(promises); console.log(results); } // 或者使用下面的写法 async function dbFuc(db) { let docs = [{}, {}, {}]; let promises = docs.map((doc) => db.post(doc)); let results = []; for (let promise of promises) { results.push(await promise); } console.log(results); }