2016-07-08 5 views
1

私はnode.jsを初めて使用しており、ジェネレータ関数に呼び出しをラップすることによってcoライブラリを利用しているコードベースで作業しています。簡略化した例は、次のようになります。co node.jsライブラリの目的は何ですか?

module.exports.gatherData = function*() 
{ 
    // let img = //get the 1 pixel image from somewhere 
    // this.type = "image/gif"; 
    // this.body = img; 

    co(saveData(this.query)); 
    return; 

}

function *saveData(query) 
{ 
    if(query.sid && query.url) 
    { 
     // save the data 
    } 
} 

だから私はgithubの上の共同のホームページに行き、説明が書かれています:

nodejsとブラウザのための「ジェネレータベースの制御フローの良さ、約束を使用して、あなたがAで非ブロックのコードを記述せ素敵なやり方。 "

node.jsのコンテキストでこのコードを非ブロックにすることはできませんか?

yield saveData(this.query) 
+0

*このコードはNode.jsののコンテキストで、あまりにも非ブロックではないでしょうか? * No.イテレータとジェネレータは同期動作です。 * co *ライブラリはジェネレータ構文を使用して、非同期コードを同期的に書かれているように見せる約束を守ります。 'yield saveData'は単に未解決のPromise – CodingIntrigue

+0

実際には' co(saveData(this.query)); 'を生成しますが、ジェネレータ内部は実際にはゴミです。 – Bergi

+0

なぜゴミは?あなたは詳しく説明できますか? –

答えて

3

ジェネレータ機能に関するブロック/非ブロックはありません。これらは、中断可能な制御フローを表現する単なるツールです。

フローがどのように中断されるかは、ジェネレータの呼び出し元、この場合は非同期値が返されるまで待機するcoライブラリによってのみ決定されます。皮膚には多くの方法がこの猫はcoであります

  • module.exports.gatherData = co.coroutine(function*() { 
        … 
        yield saveData(this.query)); 
    }); 
    var saveData = co.coroutine(function* (query) { 
        if(query.sid && query.url) { 
         // save the data 
        } 
    }); 
    
  • module.exports.gatherData = co.coroutine(function*() { 
        … 
        yield co(saveData(this.query)); 
    }); 
    function *saveData(query) { 
        if(query.sid && query.url) { 
         // save the data 
        } 
    } 
    
  • module.exports.gatherData = co.coroutine(function*() { 
        … 
        yield* saveData(this.query)); 
    }); 
    function *saveData(query) { 
        if(query.sid && query.url) { 
         // save the data 
        } 
    } 
    
関連する問題