本文主要是通過一些**示例來記錄和總結生成器的用法。
yield
和next
在生成器中扮演著非常重要的角色,前者是乙個操作符,後者是生成器上的乙個函式。
他們具有以下特性:
以上說了很多,先利用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 ...