从生成器函数中包装co和co-mysql,并从包装函数中退出

时间:2014-09-24 14:34:35

标签: javascript node.js generator co

我无法理解co以及如何在其他生成器中利用其功能。基本上我有一个需要执行SQL查询的生成器,然后在将它们输出到调用函数(在循环中)之前对每一行做一些复杂的事情。

someGen代码对我来说并不合适,并且它没有按预期工作。所以我的问题是双重的。 首先我如何在生成器中利用co-mysql,从而产生每行创建的对象。 第二我正在努力使用co,更重要的是为什么。

没有正常的尝试:

const co = require('co')
    , mysql = require('co-mysql')
    , MYSQL_RECORD_SET = 0

let pool = null
let getConnectionPool = function(){
    if(!pool) pool = mysql.createPool(config.db);
    return pool
}

let someGen = function*() {
    co(function*() {
        let connection = getConnectionPool()
        let recordset = yield connection.query('SELECT ? as jobId', [ 99 ]);

        if (recordset && recordset[MYSQL_RECORD_SET]) {
            var jobs = _.map(recordset[MYSQL_RECORD_SET], function (row) {
                return {id: row.jobId }
            })
            yield jobs
        }
    })()
}

for (let job of someGen()) {
    console.log(job)
}

1 个答案:

答案 0 :(得分:0)

这是"工作" - 但不是我最初拍摄的。 someGen现在执行查询,但返回一个对象数组,而不是单独产生它们......

let someGen = function *() {
    let connection = getConnectionPool()
    let recordset = yield connection.query('SELECT ? as jobId', [ 99 ]);
    if (recordset && recordset[MYSQL_RECORD_SET]) {
        return _.map(recordset[MYSQL_RECORD_SET], function (row) {            
            return { jobId: jobId }
        })
    }
}

let runIt = function() {
    var doSomething = function(job){
    }

    co(function*() {
        let jobBatch = yield someGen()
        _.each(jobBatch, function(job){
            doSomething(job) ;
        })
    })()
}

仍在寻找更好的答案。