ES 6 Generatorの応用シーン
2577 ワード
一、基礎知識
APIドキュメント
ES 6の誕生前に、非同期プログラミングの方法は、次の4つがあります.コールバック関数 事件の傍受 リリース/購読 Promiseオブジェクト Generator関数はJavaScriptを非同期的にプログラムして新しい段階に持ち込んだ.
二、応用シーン
1.例えば、抽選の一環で、現在のユーザーは5回も抽選できます.クリックした回数が1を減らします.
ES 5の方式を採用すれば、Generatorを使用しないと、countをグローバル変数に預け入れる必要がありますが、これは非常に安全ではなく、他の人が変数が何かを知っていれば、変数を変更できます.またグローバル変数を保存するとパフォーマンスにも影響します.
場面:サービス先のあるデータの状態が定期的に変化します.フロントエンドはタイミングよくサービスエリアに取りに行きます.
このようなシーンには、2つの解決策があります.
1)ロングポーリング(タイマー、タイミングアクセスインターフェース)
2)websocket(ブラウザの互換性が悪い)
転載先:https://www.cnblogs.com/knyel/p/7844787.html
APIドキュメント
ES 6の誕生前に、非同期プログラミングの方法は、次の4つがあります.
二、応用シーン
1.例えば、抽選の一環で、現在のユーザーは5回も抽選できます.クリックした回数が1を減らします.
ES 5の方式を採用すれば、Generatorを使用しないと、countをグローバル変数に預け入れる必要がありますが、これは非常に安全ではなく、他の人が変数が何かを知っていれば、変数を変更できます.またグローバル変数を保存するとパフォーマンスにも影響します.
{
let draw=function(count){
// ,
//
console.log(` ${count} `)
}
// Generator
let residue=function*(count){
while(count>0){
count--
yield draw(count)
}
}
// Generator , , next,
let star=residue(5)
let btn=document.createElement('button')
btn.id='start'
btn.textContent=' '
document.body.appendChild(btn)
document.getElementById('start').addEventListener('click',function(){
star.next()
},false)
}
2.ロングポーリング場面:サービス先のあるデータの状態が定期的に変化します.フロントエンドはタイミングよくサービスエリアに取りに行きます.
このようなシーンには、2つの解決策があります.
1)ロングポーリング(タイマー、タイミングアクセスインターフェース)
2)websocket(ブラウザの互換性が悪い)
{
let ajax=function* (){
yield new Promise(function(resolve,reject){
setTimeout(function(){
resolve({code:0})
},200)
})
}
let pull=function(){
let generator=ajax()
let step=generator.next()
step.value.then(function(d){
if(d.code!=0){
setTimeout(function(){
console.log('wait')
pull()
},1000)
}else{
console.log(d)
}
})
}
pull()
}
出力結果は{code: 0}
resolive({code:0})のcodeを1に変えて、ずっとポーリングして、結果を出力します.wait
wait
wait
...
転載先:https://www.cnblogs.com/knyel/p/7844787.html