1

我想使用 Koa 和mysqlnode 包从我的 MySQL 数据库中获取一些数据。我在看co-mysql,但自述文件建议使用thunkify直接使用。所以我做了以下事情:

const query = thunkify(connection.query.bind(connection));

这似乎可行,就像我现在可以做的那样:

app.use(function * main() {
  const races = yield query(
    "SELECT * FROM `races` where '2016-01-19' between start_date and end_date"
  )(function(err, rows) {
    // rows is the data I need
  });
});

但是,我找不到将 thunk 中的行数据返回/生成到我的 races 变量中的方法。我记录它,它显示正确的数据,但是当我尝试将它传回时,它总是返回未定义的。我从回调内部尝试了几种方法,但我似乎无法弄清楚:

return rows yield rows(使回调成为生成器函数) return yield rows ...

我经常得到:TypeError: You may only yield a function, promise, generator, array, or object, but the following object was passed: "undefined"

4

1 回答 1

1

races是一个数组,因为您使用的是thunkifyfor query。co 为任何使用多个值调用其回调的 thunk 返回一个数组(即callback(null, 1, 2, 3)返回[1, 2, 3].

如果您改为 Promisify queryraces则将仅分配给第一个返回值,这似乎与您正在寻找的内容一致。

这是一个在实践中展示它的代码示例:

var co = require("co")
var promisify = require("bluebird").promisify
var thunkify = require("thunkify")

function async(callback) {
    callback(null, 1, 2, 3)
}

var p = promisify(async)
var t = thunkify(async)

co(function*() {
    let x = yield p()
    let y = yield t()
    console.log(x)
    console.log(y)
}).then(() => {})

运行时, 的值为 ,x1值为y数组[1, 2, 3]

您可以在此处使用 Tonic 运行它:https ://tonicdev.com/56ab7cfc879afb0c002c1d49/56ab7cfc879afb0c002c1d4a

于 2016-01-29T15:10:24.220 回答