2015-12-29 36 views
12

C# dünya dan geliyor, javascript iki yönlü jeneratörler pratik kullanımının ne olduğunu anlamak için merak ediyorum. Jeneratörlerin genel olarak nasıl yararlı olabileceğini anlayabiliyorum, ancak iki yönlü jeneratörler söz konusu olduğunda değil. RxJS veya beğeniyle kullanabilir miyiz? Kullanılabilecek herhangi bir desen/senaryoyu açıklayabilir misiniz?Javascript'te iki yönlü jeneratörler gerçek dünya kullanımı

function* interrogate() { 
    let name = yield "What is your name?"; 
    let color = yield "What is your favorite color?"; 
    return `${name}'s favorite color is ${color}.`; 
} 

let it = interrogate(); 
it.next();   // { value: "What is your name?", done: false } 
it.next('Ethan'); // { value: "What is your favorite color?", done: false } 
it.next('orange'); // { value: "Ethan's favorite color is orange.", done:true } 
+1

Örneğiniz sadece bu değil mi? – Xotic750

+0

@ Xotic750 Bir çizgi basmak için böyle bir şeyi asla kodlamamıştım :), böylece iki yönlü jeneratörler diğer mekanizmalardan çok daha uygun olan kullanım durumunu veya desenini anlamaya çalışıyorum. –

+0

Anladığım kadarıyla, çoğunlukla async sorununu ele almak ve Promises ile birleştirmek için kullanılır. Anahtar kelimeyi kullanarak daha fazla arama yapabilirsiniz. –

cevap

8

David Walsh O bir örnek olan bir blog about ES6 Generators

sahiptir

function *foo(x) { 
    var y = 2 * (yield (x + 1)); 
    var z = yield (y/3); 
    return (x + y + z); 
} 

var it = foo(5); 

// note: not sending anything into `next()` here 
console.log(it.next());  // { value:6, done:false } 
console.log(it.next(12)); // { value:8, done:false } 
console.log(it.next(13)); // { value:42, done:true } 

sizin örnek olarak imal Ama yine kullanıldığı durumdur. Onun Özetle

o

Bu yeni egzotik oyuncak kodunuz için pratik yapmaya ne olup bittiğini merak doğal olduğunu söylüyor. Gerçi onlar için daha çok şey var. sadece yüzeyi çizdik. Bu yüzden 'un ne kadar güçlü olabileceğini/keşfedebileceklerini keşfetmeden önce daha derine dalmamız gerekiyor.

  • Hata işleme nasıl çalışır?
  • Bir jeneratör başka bir jeneratöre çağrı yapabilir mi?
  • Eşzamansız kodlama jeneratörlerle nasıl çalışır?

Bu sorular ve daha fazlası, sonraki makalelerde ele alınacaktır Burada kalmayın!

In a later blog o biraz daha gerçek dünya gibi görünüyor şu pasajı (ve bazı diğerleri)

// run (async) a generator to completion 
// Note: simplified approach: no error handling here 
function runGenerator(g) { 
    var it = g(), ret; 

    // asynchronously iterate over generator 
    (function iterate(val){ 
     ret = it.next(val); 

     if (!ret.done) { 
      // poor man's "is it a promise?" test 
      if ("then" in ret.value) { 
       // wait on the promise 
       ret.value.then(iterate); 
      } 
      // immediate value: just send right back in 
      else { 
       // avoid synchronous recursion 
       setTimeout(function(){ 
        iterate(ret.value); 
       }, 0); 
      } 
     } 
    })(); 
} 

runGenerator(function *main(){ 
    var result1 = yield request("http://some.url.1"); 
    var data = JSON.parse(result1); 

    var result2 = yield request("http://some.url.2?id=" + data.id); 
    var resp = JSON.parse(result2); 
    console.log("The value you asked for: " + resp.value); 
}); 

sahiptir. Bir jeneratör + vermiştir söz (ler) gerçekten güçlü ve zarif senkronizasyon (görünüyorsun) almak zaman uyumsuz kontrol ifadesi yetenekleri akmaya hem dünyanın en iyi birleştiriyor:

O Basitçe

özetlemektedir. Basit sarıcı yardımcı programları ile ( birçok kütüphane zaten mevcuttur), otomatik olarak jeneratörlerimizi, sane ve sync (manzaralı) hatası kullanımı dahil olmak üzere tamamlamamız için otomatik olarak çalıştırabiliriz!

İlgili konular