咱們本篇說的依然還是咱們的generator,實際上來說,咱們之前已經說了generator是啥以及generator里的yield怎麼個用法,那接下來呢,咱就要具體來看個例子了,東西咱都搞明白了,之前也說這個東西能解決非同步操作,那下面就來看看怎麼玩。
首先呢這個東西需要輔助一些玩意來用用,這是一個runner(點我下載),runner里有一些這個東西那個東西的,咱先不去提,先拿它來玩玩。
比方說咱先來幾個文件吧,咱們主要以數據讀取為最簡單的方式
好了,文件咱有了,接下來咱們來看看generator在咱們的數據讀取中有著怎樣的應用
事情是這樣的:
當然你也知道的,咱們一定要用到咱們的runner的,不然也沒必要把它請出來;當然,咱們也引入一個jquery,也不是一定要用到,但是有現成的,咱們就沒必要自己寫了。
然後這些東西湊齊之後,就開始召喚點什麼東西了
正常的ajax怎麼寫,我也不去跟大家多說,大家也都知道,一層摞一層、一層摞一層,摞的各種過癮。那麼有了runner之後,它呢,讓我們給它傳一個generator作為它的參數,然後像同步操作一樣去寫非同步操作,非常方便
咱們走一個
咱們可以看到三個文件中的數據都讀取到了,就這麼簡單,其實generator它的好處就是能夠讓我們像寫同步操作一樣去寫非同步操作,當然咱也簡單的解析它一下
其實跟咱前面說的generator的原理是一樣的,說白了,我現在把這個ajax,這個ajax其實給我的是一個promise對象,這個大家應該了解,然後咱們把這個promise對象yield出去,yield給咱們的runner,因為是咱們的runner在執行這個generator函數,咱先不扯細節,咱說大面,相當於第一個ajax產生的promise對象,給了咱們的runner,然後函數暫停,等什麼時候請求完了,函數控制權再還給咱們的generator函數,結果就給了data1,後面的也是一樣,讀取完了之後,結果給到data2和data3,當然這些不重要,至少在咱們看來,它和咱們寫平常函數沒什麼區別,老方便了。
面對非同步操作,咱們對比一下幾種方法:
1、回調
2、Promise
3、generator
//回調 $.ajax({ url: xxx, dataType: json, success(data1){ $.ajax({ url: xxx, dataType: json, success(data2){ $.ajax({ url: xxx, dataType: json, success(data3){ //完事 },error(){ alert(錯了); } }) },error(){ alert(錯了); } }) },error(){ alert(錯了); } });
//Promise Promise.all([ $.ajax({url: 用戶,dataType: json}), $.ajax({url: xxx,dataType: json}), $.ajax({url: xxx,dataType: json}) ]).then(results=>{ //完事 },err=>{ alert(錯了) });
//generator runner(function *(){ let data1 = yield $.ajax({url: xxx,dataType: json}); let data2 = yield $.ajax({url: xxx,dataType: json}); let data3 = yield $.ajax({url: xxx,dataType: json});
//完事 });
我們可以看到,Promise和generator確實比傳統的ajax寫法要簡單很多,也方便很多,但是我們看到,generator和Promise好像也沒有特別大的區別,generator和Promise相比好像也沒有特別省事。沒錯,在這種情況下,generator和Promise確實沒有多大區別,但是Promise也有它不適用的地方,不適用的地方在哪呢?
你看,咱如果是連續請求數據,中間並沒有其他操作的話,那generator和Promise沒有太大區別,而generator的優點在於,它中間可以摻雜一些邏輯,比方說在Promise函數里我們第一個請求讀的是用戶數據,通過請求來的數據判斷是普通用戶還是VIP用戶,然後通過用戶身份再去請求下面的商品,那這個東西就歡樂了。
這種我管它叫帶邏輯的數據讀取,下面讓咱來看看帶邏輯的讀取是什麼樣的
//帶邏輯-普通回調 $.ajax({url: getUserData, dataType: json,success(UserData){ if(UserData.type==VIP){ $.ajax({url:getVipItems, dataType: json, success(items){ //生成列表、顯示.... },error(err){ alert(錯了) }}) }else{ $.ajax({url:getItems, dataType: json, success(items){ //生成列表、顯示.... },error(err){ alert(錯了) }}) } },error(err){ alert(錯了) }});
//帶邏輯-Promise Promise.all([ $.ajax({url: getUserData, dataType: json}) ]).then(results=>{ let data = results[0]; if(UserData.type == VIP){ Promise.all([ $.ajax({url: getVipItems, dataType: json}) ]).then(results=>{ let items = results[0]; //生成列表、顯示.... }, err=>{ alert(失敗) }) }else{ Promise.all([ $.ajax({url: getItems, dataType: json}) ]).then(results=>{ let items = results[0]; //生成列表、顯示.... }, err=>{ alert(失敗) }) } },err=>{ alert(失敗) });
//帶邏輯-generator runner(function *(){ let userData = yield $.ajax({url: getUserData,dataType: json}); if(userData.type ==VIP){ let items = yield $.ajax({url: getVipItems, dataType: json}); }else{ let items = yield $.ajax({url: getItems, dataType: json}); } //生成列表、顯示.... })
從咱們代碼里能看出來,說句不好聽的,帶邏輯的版本的Promise真心比直接用ajax還麻煩,反過來,咱們今天的主角,咱們的generator使用起來和咱平常寫代碼基本上一樣,這才叫生活,這才叫做東西。
所以咱們發現,generator最大的好處在於,當有了邏輯之後非常方便。
所以咱們知道了,Promise適用於一次讀一堆數據的情況,而generator比較適用於中間摻雜邏輯的情況,邏輯性比較強。
所以在合適的場景用合適的東西,就這麼點兒事。
反正呢,基本上來說,咱們也已經認識了generator,知道了yield怎麼玩,以及知道了generator怎麼用,也知道它適合用在什麼樣的場景,挺好、不錯,當然在後面的應用當中,咱們會對generator有更加深入的理解。
反正呢,這個generator有點麻煩,有點亂,有點熱鬧,咱們基本上就說這麼多,咱們接下來再看看其他的東西~