摘要:示例運行函數(shù)彈出彈出函數(shù)接收參數(shù),返回值。其中,返回一個對象,是的返回值,代表函數(shù)是否執(zhí)行完成。
ES6特性介紹(下)
ES6新的標(biāo)準(zhǔn),新的語法特征:
1、變量/賦值
2、函數(shù)
3、數(shù)組/json
4、字符串
5、面向?qū)ο?br>6、Promise
7、generator
8、ES7:async/await
《【W(wǎng)eb全棧課程二】ES6特性介紹(上)》見:https://segmentfault.com/a/11...
6、Promise根本作用,解決異步的操作,將異步操作寫法同步化,是es6提供給我們的語法糖(內(nèi)部實現(xiàn)依舊是異步)
同步-串行 簡單、方便 頁面假死的現(xiàn)象
異步-并發(fā) 性能高、體驗好
使用wamp作為本地服務(wù)器使用
【補(bǔ)充:wamp用法】ajax獲取數(shù)據(jù)需要使用服務(wù)器,項目都放在www里面,訪問時按照如下對應(yīng)關(guān)系轉(zhuǎn)換
本地物理地址:c:wamp64www
本地網(wǎng)絡(luò)地址:http://localhost/
Ajax發(fā)送請求
缺點:異步請求邏輯和結(jié)果處理邏輯耦合在一起,不便于復(fù)用和書寫
同步的簡單寫法實現(xiàn)異步,獲取一條url數(shù)據(jù)。Promise在ES6中被統(tǒng)一規(guī)范,由瀏覽器直接支持,它最大的好處是在異步執(zhí)行的流程中,把執(zhí)行代碼和處理結(jié)果的代碼清晰地分離
let p =new Promise((resolve, reject) => { resolve(); reject(); }); p.then(success=>{},err=>{});
補(bǔ)充一下ajax和Promise混用的原理,我們可以將ajax操作的返回值打印出來,發(fā)現(xiàn)里面有then方法、catch方法,其實它就是一個Promise對象。那么我們?yōu)槭裁催€要使用Promise?promise的all和race能很好地處理多條異步操作。
Promise.all:接收promise數(shù)組,在所有異步操作執(zhí)行完后才執(zhí)行回調(diào)。 Promise.race:接收promise數(shù)組,只要有一個異步操作執(zhí)行完畢就執(zhí)行回調(diào)。
Promise.all([ $.ajax("/banner_data"), $.ajax("/item_data"), $.ajax("/users_data"), $.ajax("/news_data"), ]).then(arrs=>{ let [banners,items,users,news]=arrs; },err=>{});7、generator 生成器
promise只能提供race和all的邏輯操作,如果我們要實現(xiàn)更加復(fù)雜的異步操作,例如等待a異步操作完成后根據(jù)a的結(jié)果選擇執(zhí)行b或者c,使用promise就需要寫很多的嵌套,又不能滿足我們代碼的高可用和可讀性。
這里先給大家介紹generator提供的解決方案,實際使用中g(shù)enerator并不方便,我們一般使用async/await,后面會提到。
1.generator函數(shù)前面有*號
function show(){} //普通函數(shù) function *show1(){}//generator函數(shù)
2.generator函數(shù)的特點是能夠暫停,等待某個動作(異步操作)完成后繼續(xù)執(zhí)行。什么時候暫停呢?我們需要告訴它暫停的時間點,我們通過yield告訴generator函數(shù)暫停,yield也只能在generator函數(shù)使用。
//generator函數(shù) function *show(){ alert("aaa"); yield; //函數(shù)暫停 alert("bbb"); } show();
我們直接調(diào)用show(),會發(fā)現(xiàn)界面沒有任何效果,和我們習(xí)慣的函數(shù)順序執(zhí)行使用習(xí)慣并不相同。generator函數(shù)返回的是一個generator對象,需要next()才能運行g(shù)enerator函數(shù)。示例:
// 運行g(shù)enerator函數(shù) let gen = show(); gen.next(); //彈出aaa gen.next(); //彈出bbb
3、generator函數(shù)接收參數(shù),返回值。其中,gen.next()返回一個對象,value是yield的返回值,done代表函數(shù)是否執(zhí)行完成。
function *show(){ alert("aaa"); //let a = yield 接收next給的參數(shù); yield 55 返回值55 let a = yield 55; alert("bbb"+","+a);//彈出bbb,23 } let gen=show(); let res1=gen.next();console.log(res1);//{value: 55, done: false} let res2=gen.next(23);console.log(res2);//{value: undefined, done: true}
以上執(zhí)行,有2個點讓人疑惑
1、返回值:yield 55返回給第一個next了
2、接受參數(shù):let a = yield接收的是第二個next傳遞進(jìn)來的參數(shù)
我們用下面這張圖來很好的解釋這個原因,紅色圈出來的部分是第一個next的范圍,綠色圈出來的是第二個next的范圍。也就是說yield返回屬于上一個next,接收參數(shù)屬于下一個next。
小結(jié):
1、箭頭函數(shù)不能寫generator函數(shù)
2、generator只是一個過渡,從例子中看到y(tǒng)ield的使用有很多約束,也不符合我們常用的使用習(xí)慣。一般使用async/await
async/await也可以在執(zhí)行中暫停,await等待一個異步操作完成后再繼續(xù)往下執(zhí)行,它將異步操作同步化。await一定使用在async函數(shù)中,先來直接看下使用方式
async function show() { alert("aaa"); //12是一個數(shù)值,不是異步操作,不會進(jìn)行等待 await 12; alert("bbb"); } show();
1、await后面跟一個異步操作,否則不會進(jìn)行等待。如上代碼就不會進(jìn)行等待。
setTimeout不是異步操作,但是如果包成promise,await就會認(rèn)為它是一個異步操作,如下代碼彈出aaa后會等待2s后再彈出bbb。
function sleep(){ return new Promise((resolve,reject)=>{ setTimeout(()=>{resolve();},2000); }); } async function show() { alert("aaa"); await sleep();//等待2s alert("bbb"); } show();
2、await進(jìn)行邏輯操作
我們在1.txt文件中存放{"a":12,"b":5},實現(xiàn)如果a+b<10則獲取2.txt,否則獲取3.txt,可以預(yù)見到結(jié)果會進(jìn)去獲取3.txt的分支。
//用箭頭函數(shù)寫async函數(shù),匿名函數(shù) (async ()=>{ let data1 = await $.ajax({url:"../datas/1.txt",dataType:"json"}); //獲取data1的異步請求已經(jīng)執(zhí)行完成 if(data1.a+data1.b<10){ let data2 = await $.ajax({url:"../datas/2.txt",dataType:"json"}); console.log("2.txt"); console.log(data2); } else { let data3 = await $.ajax({url:"../datas/3.txt",dataType:"json"}); console.log("3.txt"); console.log(data3); } })();
結(jié)果如下:
小結(jié):
1、await一定使用在async函數(shù)中
2、await必須等待一個異步操作,通常等待一個promise
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/107900.html
摘要:原因中,定義的變量沒有塊級作用域,在第一個中循環(huán)后已經(jīng)是,里面的執(zhí)行的時候彈出的就是。 ES6特性介紹(上) ECMAScript(簡稱ECMA、ES),ES6也被稱為ECMAScript 2015JavaScript是ECMAScript的一種,但是目前實現(xiàn)ECMAScript標(biāo)準(zhǔn)的僅JavaScript ES6新的標(biāo)準(zhǔn),新的語法特征:1、變量/賦值2、函數(shù)3、數(shù)組/json4、字符...
摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
閱讀 929·2023-04-25 23:40
閱讀 3710·2021-11-22 15:22
閱讀 3547·2021-10-09 09:44
閱讀 3403·2021-09-23 11:52
閱讀 1257·2021-09-22 15:43
閱讀 784·2021-09-10 10:51
閱讀 2205·2021-09-06 15:02
閱讀 3197·2021-09-06 15:02