async函數

1、概念

①async函數是ES6裏增長的函數,使得異步操做變得更加簡單html

②在async函數內部使用await的方式來操做異步API,awit是一種新的語法,只能在asysc函數中使用,await通常是在其後跟一個promise操做APInode

③參考以前的文章:異步編程(回調函數,promise)es6

④async函數的文檔能夠參考:http://es6.ruanyifeng.com/#docs/async編程

// a.txt 的內容是 ‘hello aaa’

// 在node中提供了一個一個根據函數,專門用來把一些callback形式的API包裝成promise的方法
var util = require('util')
var fs = require('fs') 
var readFile = util.promisify(fs.readFile)

async function read() {
    const a = 1
    const b = await readFile('./data/a.txt','utf8')
    const c = 2
    console.log(a,b,c)
}
console.log(3)
read()
console.log(4)

2、對比三種方式

①callback方式數組

// a.txt 的內容是 ‘hello aaa’
// b.txt 的內容是 ‘hello bbb’
// a.txt 的內容是 ‘hello ccc’

var fs = require('fs');

fs.readFile('./data/a.txt','utf8',function(err,data){
    if(err){
        throw err
    }
    console.log(data)
    fs.readFile('./data/b.txt','utf8',function(err,data){
        if(err){
            throw err
        }
        console.log(data)
        fs.readFile('./data/c.txt','utf8',function(err,data){
            if(err){
                throw err
            }
            console.log(data)
        })

    })
})

②promise方式promise

// a.txt 的內容是 ‘hello aaa’
// b.txt 的內容是 ‘hello bbb’
// a.txt 的內容是 ‘hello ccc’

var fs=require('fs')

function readFile(...args){
    // 出如今方法定義參數叫作:rest參數
    // 出如今方法調用參數中叫作:數組的展開操做符
    return new Promise((resolve,reject) =>{
        fs.readFile(...args,(err,data) =>{
            if(err){
                return reject(err)
            }
            resolve(data)
        })
    })
}

readFile('./data/a.txt','utf8').then(data => {
    console.log(data)
    return readFile('./data/b.txt','utf8')
}).then(data => {
    console.log(data)
    return readFile('./data/c.txt','utf8')
}).then(data => {
    console.log(data)
})

③async方式異步

// a.txt 的內容是 ‘hello aaa’
// b.txt 的內容是 ‘hello bbb’
// a.txt 的內容是 ‘hello ccc’

// 在node中提供了一個一個根據函數,專門用來把一些callback形式的API包裝成promise的方法
var util = require('util')
var fs = require('fs') 
var readFile = util.promisify(fs.readFile)

async function read() {
    const dataA = await readFile('./data/a.txt','utf8')
    const dataB = await readFile('./data/b.txt','utf8')
    const dataC = await readFile('./data/c.txt','utf8')
    return [dataA,dataB,dataC]
}
read().then(data => {
    console.log(data)
})

3、結論

①任何函數前面加上async就變爲了一個async函數,只有在async函數中才能夠使用await結合Promise來使用同步的風格來調用異步APIasync

②HTML5新增了一個fetch API 用於發送請求,和 XMLHttpRequest功能差很少,可是原生支持promise,能夠參考:MDN文檔
異步編程

③async函數返回的是一個Promise對象,須要經過then的方式來接收數據函數

相關文章
相關標籤/搜索