1.Nodejs新特性async await 的使用
-
以前異步處理方式,通過回調函數來獲取異步方法數據。
function getData(callback) { setTimeout(function(){ var name = "小紅" callback(name) },1000) } getData(function (name){ console.log(name);//小紅 })
-
ES6出來可以通過Promise來進行異步處理
// 方式1 var p = new Promise(function (resolve, reject) { // resolve 表示執行成功 // reject 表示執行失敗 setTimeout(() => { var name = "小明"; resolve(name) }) }) p.then( (data) => { console.log(data);// 小明 }) // 方式2 ,封裝getData函數 function getData(resolve, reject) { setTimeout(function (){ var name = "Tom" resolve(name); }, 1000) } var p = new Promise(getData) p.then((data)=> { console.log(data); //Tom })
-
async 是異步簡寫 , 而await可以認為是async wait的簡寫,所以應該很好理解async用於申明一個異步的function,而await用於等待一個異步方法執行完成。
- 簡單理解:async 是讓方法變成異步,await是等待異步方法執行完畢。
async function test () { return "hello world!" } console.log(test())// Promise { 'hello world!' } async function main () { var data = await test(); console.log(data);// hello world! } main()
-
示例2
async function test () { return new Promise((resolve, reject) => { setTimeout(function () { var name = "Lucy"; resolve(name); }, 1000) }) } async function main () { var data = await test(); console.log(data);//Lucy } main()
-
練習: 獲取當前路徑下為文件目錄的文件名
var fs = require("fs") async function isDir(path) { return new Promise((resolve, reject)=> { fs.stat(path, (err,stats)=> { if (err) { console.log(err); reject(err); return } if (stats.isDirectory()) { resolve(true); }else { resolve(false); } }) }) } function main() { var path = "../01.node" var dirArr = [] fs.readdir(path, async (err, data)=> { if (err) { console.log(err); return } for (var i=0;i<data.length;i++){ if (await isDir(path + '/' + data[i])) { dirArr.push(data[i]) } } console.log(dirArr) }) } main()