小試ES6 非同步程式設計之Generator

2021-07-22 09:44:58 字數 1930 閱讀 5461

本文主要是通過一些**示例來記錄和總結生成器的用法。

yieldnext在生成器中扮演著非常重要的角色,前者是乙個操作符,後者是生成器上的乙個函式。

他們具有以下特性:

以上說了很多,先利用next的返回值特性容實現乙個無限的斐波那契數列,他永遠不會返回done=true

const f = function* fibonacci

() }();

//執行三次,得到0,1,1

for (let i of array(3).keys())

接下來通過一段**看看next和yield在傳值和返回值上的情況,如下:

const iter = function* gen

() `);

console.log(`yield $`);

return

'c' + 2;

}();

console.log(`next:$`); //輸出 next:a0

console.log(`next:$`); //輸出 yield 1 next:b1

console.log(`next:$`); //輸出 yield 2 next:c2

第乙個next觸發生成器執行到第乙個yield,並立即執行'a' + 0 = 'a0',a0作為這次next的返回值

第二個帶入參為1的next觸發生成器執行到第二個yield,此時第乙個yield返回1,並執行到下一條yield,立即這條yield後面你的'b' + 1 = 'b1'b1作為這次next的返回

第三個next執行以此類推……

我們已經知道next可以觸發生成器執行到yield操作處,並且生成器會在遇到yield時立即執行後面的語句並暫停,那麼如果yield後面是乙個非同步操作,而非同步操作獲取到結果之後再呼叫next不就實現了等待的效果麼?

function

asyncfuc

(v) , 500);

}let g = function* gen

() ();

g.next();

有了前文的基礎我們可以實現乙個用來執行多個非同步操作的函式,定義乙個run(...functions)方法依次執行傳入的函式,如下:

//這個方法用來模擬乙個非同步呼叫

function

delay

(time, callback) `);

}, time);

}function

run(...functions)

return result;

}(resume, functions);

//提供乙個方法用於推進生成器執行。

function

resume

(callbackvalue)

generator.next(); //觸發生成器立即執行第乙個方法

}//模擬非同步方法呼叫, 斐波那契數列

function

d(result, resume) else ;

}console.log(value.a);

resume(value);

});return result;

}run(d, d, d); //順序執行非同步方法

ES6非同步操作之Promise

一直以來覺得非同步操作在我心頭像一團迷霧,可是它重要到我們非學不可,那就把它的面紗解開吧。es6 誕生以前,非同步程式設計的方法,大概有下面四種。非同步 簡單的說 執行順序不是一次連續完成的,中間加入了其他的程式運算,等第一階段準備好了資料,再返回來進行計算。來看看阮一峰老師es6入門中講的的 反覆...

ES6的程式設計風格

1,建議使用let替代var 2,全域性常量使用const,多使用const有利於提高程式的執行效率。所有的函式都應該設定為常量。3,字串使用模板字串。4,解構賦值 使用陣列成員對變數賦值時,優先使用結構賦值語句。函式慘呼如果是物件的成員,優先使用解構賦值。const arr 1,2,3,4 con...

es6中的Promise機制(非同步程式設計的解決方案)

1.作用 es中沒有多執行緒,但是可以有非同步操作 promise就是非同步程式設計的解決方案 promise本身是乙個建構函式 2.建立 var p1 new promise resolve,reject 3.api 非靜態 靜態 settimeout function 2.then測試 var ...