函數(shù)(四)生成器和promise

1 生成器函數(shù)

定義和使用生成器

生成器函數(shù)能生成一組值的序列雪位。顯式地向生成器請求一個新的值,隨后生成器響應(yīng)一個新生成的值奸忽,或者告訴我們它之后不會再生成新的值叠殷。
可以使用while迭代生成器生成的值的序列改鲫,也可以使用for-of語法糖。

function *DiningCar(){
  yield '花生';
  yield '瓜子';
  yield '八寶粥';
}

const carIt=DiningCar();
let item;
while(!(item=carIt.next()).done){
  console.log(item.value);
}

for(let item of DiningCar()){
  console.log(item);
}

雙向通信

我們通過yield語句從生成器中返回值林束,再使用迭代器的next方法把值傳回生成器像棘。

function *DiningCar(user_name){
  let count_peanuts=yield '花生';
  let count_seed=yield '瓜子';
  let count_congee=yield '八寶粥';
  console.log('顧客姓名:'+user_name);
  console.log('花生:'+count_peanuts);
  console.log('瓜子:'+count_seed);
  console.log('八寶粥:'+count_congee);
}
const carIt=DiningCar('bro bear');
carIt.next();//返回'花生'
carIt.next(1);
carIt.next(2);
carIt.next(3);

向生成器拋出異常

迭代器除了next方法,還具有拋出一個異常的方法壶冒。

function *DiningCar(){
  try{
    yield '花生';
    yield '瓜子';
    yield '八寶粥';
  }
  catch(e){
    console.log('交易失敗:'+e);
  }
}
const carIt=DiningCar();
console.log(carIt.next());
carIt.throw('no enough money.');

2 promise

promise對象是對我們現(xiàn)在尚未得到但將來會得到的值的占位符缕题。如果我們兌現(xiàn)了承諾,結(jié)果會得到一個值胖腾。如果發(fā)生了問題烟零,結(jié)果則是一個錯誤瘪松。

顯式接受/拒絕promise

var promise=new Promise((resolve,reject)=>{
  resolve('23:00');
  //reject('2:00');
})
promise.then(time=>{
  console.log('sleep at '+time);
},time=>{
  console.log('sleep at '+time);
});

異常隱式拒絕promise

var promise=new Promise((resolve,reject)=>{
  sheep++;
})
promise.then(time=>{
  console.log('sleep at '+time);
}).catch(()=>{
  console.log('fail to sleep');
})

創(chuàng)建一個promise實例

promise的一個最佳例子是從服務(wù)器獲取數(shù)據(jù)。我們要承諾最終會拿到數(shù)據(jù)锨阿,但總有可能發(fā)生錯誤宵睦。

function getJSON(url){
  return new Promise((resolve,reject)=>{
    const request=new XMLHttpRequest();
    request.open('GET',url);
    request.onload=()=>{
      try{
        if(this.status===200){
          //解析json時可能發(fā)生異常
          resolve(JSON.parse(this.response));
        }
        else{
          //服務(wù)器響應(yīng)了其他代碼
          reject(this.status+' '+this.statusText);
        }
      }
      catch(e){
        reject(e.message);
      }
    }
    request.onerror=()=>{
      //和服務(wù)器通信異常
      reject(this.status+' '+this.statusText);
    };
    request.send();
  });
}

getJSON('peanut.json').then(data=>{
  console.log('we have peanuts!');
}).catch(e=>{
  console.log('we have no peanuts!');
})

鏈式調(diào)用

處理多個有先后順序、相互依賴的異步任務(wù)墅诡。

getJSON('peanuts.json')
  .then(getJSON('seeds.json'))
  .then(getJSON('congee.json'))
  .catch(error=>console.log('we have not enough food!'));

等待多個promise

處理多個獨立的異步任務(wù)壳嚎。
Promise.all方法接收一個Promise數(shù)組,并創(chuàng)建一個新的promise對象末早。當所有的promise均成功時烟馅,該promise為成功狀態(tài)。反之然磷,若其中任意一promise失敗焙糟,則該promise為失敗狀態(tài)。

Promise.all([getJSON('peanuts.json'),
  getJSON('seeds.json'),
  getJSON('congee.json')
]).then(results=>{
  results.forEach(item=>console.log('we have'+item));
}).catch(error=>console.log('交易失斞馈!'+error));

promise競賽

Promise.race方法接收一個Promise數(shù)組缺脉,并創(chuàng)建一個新的promise對象痪欲。當某一個promise被處理或被拒絕時,該promise同樣會被處理或被拒絕攻礼。

Promise.race([getJSON('peanuts.json'),
  getJSON('seeds.json'),
  getJSON('congee.json')
]).then(results=>{
  results.forEach(item=>console.log('we have'+item));
}).catch(error=>console.log('交易失斠堤摺!'+error));

3 生成器和promise相結(jié)合

不明覺厲

(async ()=>{
  try{
    const peanuts=await getJSON('peanuts.json');
    const seeds=await getJSON('seed.json');
    const congee=await getJSON('congee.json');
  }catch(e){
    console.log('Error:'+e);
  }
})()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末礁扮,一起剝皮案震驚了整個濱河市知举,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌太伊,老刑警劉巖雇锡,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異僚焦,居然都是意外死亡锰提,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門芳悲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來立肘,“玉大人,你說我怎么就攤上這事名扛×履辏” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵肮韧,是天一觀的道長融蹂。 經(jīng)常有香客問我旺订,道長,這世上最難降的妖魔是什么殿较? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任耸峭,我火速辦了婚禮,結(jié)果婚禮上淋纲,老公的妹妹穿的比我還像新娘劳闹。我一直安慰自己,他們只是感情好洽瞬,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布本涕。 她就那樣靜靜地躺著,像睡著了一般伙窃。 火紅的嫁衣襯著肌膚如雪菩颖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天为障,我揣著相機與錄音晦闰,去河邊找鬼。 笑死鳍怨,一個胖子當著我的面吹牛呻右,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞋喇,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼声滥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侦香?” 一聲冷哼從身側(cè)響起落塑,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎罐韩,沒想到半個月后憾赁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡散吵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年缠沈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片错蝴。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡洲愤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顷锰,到底是詐尸還是另有隱情柬赐,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布官紫,位于F島的核電站肛宋,受9級特大地震影響州藕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酝陈,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一床玻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沉帮,春花似錦锈死、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喇勋,卻和暖如春缨该,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背川背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工贰拿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熄云。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓壮不,卻偏偏與公主長得像,于是被迫代替她去往敵國和親皱碘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容