中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ES6生成器怎么使用

發布時間:2020-10-10 17:50:32 來源:億速云 閱讀:141 作者:小新 欄目:web開發

小編給大家分享一下ES6生成器怎么使用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

概念

生成器是由生成器函數( generator function )運行后得到的,是可迭代的。

function* gen() { 
  yield 'a';
  yield 'b';
  yield 'c';
}

let g = gen(); 
// "Generator { }"

原理及簡單運用

生成器有一個很大的特點,它可以暫停內部代碼運行,返回一個值給外部函數。(暫停后不會阻止其他代碼運行)當外部調用其 next 方法后,會繼續執行剩下的代碼,并接受外部傳來的一個參數。這個實現主要依賴于關鍵字 yield 。

yield 關鍵字使生成器函數執行暫停,yield 關鍵字后面的表達式的值返回給生成器的調用者。它可以被認為是一個基于生成器的版本的 return 關鍵字。

function* g(){
    var a = yield 2;
    console.log(a);
}

var it = g(); // 返回一個可迭代的生成器對象
console.log(it.next()); // 執行生成器函數內部代碼,第一次返回 {done: false, value: 2}
it.next(3); // 繼續執行生成器函數內部代碼,同時向生成器傳遞參數3,最后返回 {done: true, value: undefined}

一個簡單的計數器

function* count(){
    var n = 1;
    while(true){
        yield n++;
    }
}

var it = count();
it.next(); // 1
it.next(); // 2
it.next(); // 3

用同步方式寫異步代碼

以前處理異步 ajax 請求結果,一般采用傳遞回調函數的方式。一旦遇到多層回調嵌套,代碼的可讀性會降低,并且調試起來也不方便。有了生成器之后,我們就可以用同步的方式寫異步的代碼。這聽上去非常的有意思。我們的代碼將會是這樣的

function foo(){
    var result = asyncFun(); // asyncFun 是異步函數,result 是異步返回的結果
    console.log(result);
}

當然,上面的代碼并不能得到正確的結果,它只是一個設想。我們正打算用生成器來實現,而且這是可行的。想想生成器有哪些特點:

  1. 它能暫停,向外部返回值
  2. 能繼續執行剩下的代碼,并接受外部傳來的參數

這就足夠了。有了生成器函數,現在我們重新來設計代碼:

function* foo(){
    // 這里遇到了異步方法,必須停下來。
    // 等待異步方法執行完畢,并返回結果,繼續運行代碼。當然,同步 ajax 不能算,它不是異步
    // 輸出結果
}

靜下來想一想有哪些關鍵字,與暫停、繼續有關。停下來...繼續...停下來...繼續...停下來...繼續...Don't...Stop...Don't...Stop...Don't...Stop......這兩個詞就是 yieldnext.

function *foo(){
    var result = yield asyncFun(next);
    console.log(result);
}

當代碼遇到 yield 會暫停,這個時候 asyncFun 函數是不會暫停的,會執行,等執行完畢,再調用生成器的 next 方法,并將返回結果作為參數傳給 next。由于在生成器函數內部我們拿不到 next,必須借助于全局變量來傳遞 next

var next, gn;

function asyncFun(next){
    // 模擬異步請求
    setTimeout(function(){
        // 返回一個隨機數
        next(Math.random())
    }, 1000)
}

function* foo(){
    var result = yield asyncFun(next);
    console.log(result);
}

gn = foo();
next = gn.next.bind(gn);
next(); // 打印隨機數

這樣寫,運行看上去有些繁重。可以寫一個包裝函數運行含有異步代碼的生成器函數。

function asyncFun(next){
  // 模擬異步請求
  setTimeout(function(){
    // 返回一個隨機數
    next(Math.random())
  }, 1000)
}

function* foo(){
  var result = yield function(next){asyncFun(next)};
  console.log(result);
}



function wrapFun (gFn){
  var gn = foo(),
      next = gn.next.bind(gn);
  next().value(next);
}

wrapFun(foo);

演示地址

不過,自從出了 Promiseawait 之后,更多的是用這個組合,其使用也更簡單,范圍也更廣。

以上是ES6生成器怎么使用的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汶川县| 香河县| 贵溪市| 唐山市| 海晏县| 宁津县| 隆回县| 郯城县| 松潘县| 盖州市| 高陵县| 江川县| 抚顺县| 桐柏县| 东方市| 锡林郭勒盟| 南漳县| 大新县| 嘉峪关市| 乌审旗| 遂昌县| 瓮安县| 曲靖市| 昌都县| 静宁县| 贡嘎县| 黔西县| 揭西县| 连云港市| 扎兰屯市| 大化| 台中市| 嘉黎县| 磐安县| 双江| 团风县| 苏尼特右旗| 且末县| 芜湖市| 柞水县| 玉龙|