?? 個(gè)人主頁歡迎訪問 ??
大家好衡怀,本人名叫蘇日儷格够庙,大家叫我 (格格) 就好靠娱,在上一章節(jié)中我們學(xué)到了Symbol & generator的用法,下面我們一起來繼續(xù)學(xué)習(xí)async函數(shù):
async [?'z??k]:這個(gè)單詞看起來很怪異敛纲,它的原型是asynchrony喂击,意為異步,一般單詞按理說都能把音準(zhǔn)讀個(gè)大概淤翔,這個(gè)就...
與其同時(shí)呢翰绊,也有的人看了這個(gè)詞想到了放在script標(biāo)簽里的異步腳本,但是此async非彼async旁壮,這個(gè)async是ES2017出來的监嗜,有時(shí)候ajax請求需要做同步處理,就是ajax如何同步請求抡谐,那就用到它了裁奇;和ES6中的promise類似,nodeJs里面有一個(gè)典型的異步操作麦撵,下面用三種異步處理方式來讀取文件readFile():
- 1刽肠、promise來讀取文件
// promise.js
const fs = require("fs");
const read = function(fileName){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if (err) {
reject(err);
} else{
resolve(data);
}
});
});
};
read('1.txt').then(res=>{
console.log(res.toString());
return read('2.txt'); // 返回新的數(shù)據(jù),然后輸出
}).then(res => {
console.log(res.toString());
return read('3.txt');
}).then(res => {
console.log(res.toString());
});
然后用node來運(yùn)行該文件免胃,打開命令行(win+r):
因?yàn)樽x取多個(gè)文件一般都會(huì)作為一個(gè)異步來處理音五,這樣就不會(huì)阻塞程序的運(yùn)行,把fs封裝成一個(gè)Promise對象杜秸,然后在下面返回?cái)?shù)據(jù)輸出放仗,例子中的TXT文件可以寫自己的數(shù)據(jù)
- 2、generator函數(shù)讀取文件
// generator.js
const fs = require("fs");
const read = function(fileName){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if (err) {
reject(err);
} else{
resolve(data);
}
});
});
};
function * show(){
yield read('1.txt');
yield read('2.txt');
yield read('3.txt');
}
const s = show();
s.next().value.then(res => {
console.log(res.toString());
return s.next().value;
}).then(res => {
console.log(res.toString());
return s.next().value;
}).then(res => {
console.log(res.toString());
});
依然用node運(yùn)行即可撬碟,這種方式代碼量又高了不少诞挨,和Promise方式特別像,只不過是把讀取文件的信息放在了外面呢蛤,在下面依次手動(dòng)調(diào)用惶傻,特別麻煩,下面我們來介紹第三種方式:
- 3其障、async函數(shù)讀取文件
const fs = require("fs");
const read = function(fileName){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if (err) {
reject(err);
} else{
resolve(data);
}
});
});
};
async function readByAsync(){
let a1 = await read('1.txt');
let a2 = await read('2.txt');
let a3 = await read('3.txt');
console.log(a1.toString());
console.log(a2.toString());
console.log(a3.toString());
}
readByAsync();
這個(gè)函數(shù)和generator函數(shù)有些類似银室,從例子中可以看得出來,async函數(shù)在function前面有個(gè)async作為標(biāo)識励翼,意思就是異步函數(shù)蜈敢,里面有個(gè)await搭配使用,每到await的地方就是程序需要等待執(zhí)行后面的程序汽抚,語義化很強(qiáng)抓狭,下面總結(jié)一下async函數(shù)的特點(diǎn):
- 語義化強(qiáng)
- 里面的await只能在async函數(shù)中使用
- await后面的語句可以是promise對象、數(shù)字造烁、字符串等
- async函數(shù)返回的是一個(gè)Promsie對象
- await語句后的Promise對象變成reject狀態(tài)時(shí)否过,那么整個(gè)async函數(shù)會(huì)中斷午笛,后面的程序不會(huì)繼續(xù)執(zhí)行
基于上面的async的特點(diǎn),我們會(huì)用到異常捕獲機(jī)制苗桂,學(xué)過java的都知道药磺,java中有異常捕獲try...catch...
小白:這個(gè)東西是干什么的?
格格:下面讓我們來看一下它的概念
try/catch/finally 語句用于處理代碼中可能出現(xiàn)的錯(cuò)誤信息煤伟。
錯(cuò)誤可能是語法錯(cuò)誤癌佩,通常是程序員造成的編碼錯(cuò)誤或錯(cuò)別字。也 可能是拼寫錯(cuò)誤或語言中缺少的功能(可能由于瀏覽器差異)便锨。
try語句允許我們定義在執(zhí)行時(shí)進(jìn)行錯(cuò)誤測試的代碼塊驼卖。
catch 語句允許我們定義當(dāng) try 代碼塊發(fā)生錯(cuò)誤時(shí),所執(zhí)行的代碼塊鸿秆。
finally 語句在 try 和 catch 之后無論有無異常都會(huì)執(zhí)行。
注意: catch 和 finally 語句都是可選的怎囚,但你在使用 try 語句時(shí)必須至少使用一個(gè)卿叽。
提示: 當(dāng)錯(cuò)誤發(fā)生時(shí), JavaScript 會(huì)停止執(zhí)行恳守,并生成一個(gè)錯(cuò)誤信息考婴。使用 throw 語句 來創(chuàng)建自定義消息(拋出異常)。如果你將 throw 和 try 催烘、 catch一起使用沥阱,就可以控制程序輸出的錯(cuò)誤信息。
知道了這個(gè)東西是干什么的伊群,那么我們在async中怎么用呢考杉?
const fs = require("fs");
const read = function(fileName){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if (err) {
reject(err);
} else{
resolve(data);
}
});
});
};
async function readByAsync(){
let a1;
let a2;
let a3;
try{
a1 = await read('1.txt');
a2 = await read('2.txt');
a3 = await read('3.txt');
}catch(e){
//TODO handle the exception
}
console.log(a1);
console.log(a2);
console.log(a3);
}
readByAsync();
大家看完了這個(gè)async是不是感覺還挺有用的啊,以后工作中async就會(huì)替代generator舰始,原理是Promise崇棠,所以說特別好用。
關(guān)于async函數(shù)我們都已經(jīng)了然于心丸卷,預(yù)知Set & Map數(shù)據(jù)結(jié)構(gòu)如何枕稀,請聽下回分解 (^?^)/~~~
本文的所有內(nèi)容均是一字一句敲上去的,希望大家閱讀完本文可以有所收獲谜嫉,因?yàn)槟芰τ邢尬溃莆盏闹R也是不夠全面,歡迎大家提出來一起分享沐兰!謝謝O(∩_∩)O~
歡迎訪問我的GitHub哆档,喜歡的可以star,項(xiàng)目隨意fork僧鲁,支持轉(zhuǎn)載但要下標(biāo)注虐呻,同時(shí)恭候:個(gè)人博客