【问题标题】:Getting a Generator Function Returned as an Object Instead of Actually Invoking the Generator Function将生成器函数作为对象返回,而不是实际调用生成器函数
【发布时间】:2015-07-30 05:39:26
【问题描述】:

由于某种原因,我返回了 [object Generator],而不是实际调用生成器函数本身。所以对于 console.log("results:" + result);我知道我正在取回一个生成器函数。

gateway.js

function _find(carId)
{
    var result = _carModel.find(carId);

    console.log("results: " + result);
    return result;
};

carModel.js

'use strict';

var pg = require('co-pg')(require('pg'));
var config = require('../../models/postgreSQL-Config');

var car = module.exports = {};

car.find = function *(id)
{
    var query = 'SELECT id, title, description, source FROM car WHERE id = ' + id;
        var poolConnection = yield pg.connectPromise(config.connection);

        var client = poolConnection[0];
        var done = poolConnection[1];

        var result = yield client.queryPromise(query);
        done();

        return result.rows;
};

更新

我先尝试了 q,然后是这样尝试的:

gateway.js

function _find(carId)
{
    _carModel.find(carId)
    .then(function(result){
            console.log(result);
        return result;
        })
    .catch(function(error){
            console.log("promise error: " + error);
        })
    .done();
}

carModel.js

'use strict';

var Q = require('q');
var pg = require('co-pg')(require('pg'));
var config = require('../../models/postgreSQL-Config');

var car = module.exports = {};

car.find = Q.fbind(function *(id)
{
    console.log("GOT HERE!!!!!!");
    var query = 'SELECT id, title, description, source FROM car WHERE id = ' + id;
    var poolConnection = yield pg.connectPromise(config.connection);

    var client = poolConnection[0];
    var done = poolConnection[1];
    var result = yield client.queryPromise(query);
    done();

    console.log("RRRRRROOOOOOWWWS: " + result.rows);

    return result.rows;
});

它再也不会触发我的 find 方法,我现在在终端中得到它,以记录您在我的网关函数中看到的结果:

{ _invoke: [Function: invoke] }
{ _invoke: [Function: invoke] }
{ _invoke: [Function: invoke] }
{ _invoke: [Function: invoke] }

【问题讨论】:

  • yield 仅在生成器函数内有效 *
  • 把它改成了一个新问题,我有一个差异问题。
  • 你应该使用Q.async,而不是Q.fbind

标签: javascript node.js


【解决方案1】:

调用生成器函数确实返回了一个生成器,而不是结果。您可以使用.next() 单步执行生成器。

但听起来你正在寻找的是用co.wrapQ.async 之类的东西包装你的生成器函数(还有很多其他的)。它们使您的生成器函数返回一个以最终结果解析的 Promise。

所以你会在carModel.js 中拥有这个(添加了co.wrap):

car.find = co.wrap(function *(id)
{
    // your code
});

然后您的gateway.js 代码将变为:

function _find(carId)
{
    return _carModel.find(carId)
        .then((result) => {
            console.log("results: " + result);
            return result;
        });
}

您可以在this blogpost 阅读更多相关信息。

【讨论】:

  • 我需要从 Q._carModel 开始吗?非常感谢您的回复
  • 应该是car.find = Q.async(function *(id) { /* ... */ });。我已经添加了carModel.js 如何查看上面的答案。
  • 谢谢。还要注意,虽然 co-pg 已经内置了我在这里使用的 promise 函数。那么将其包装在另一个 promise 包装器中是否有意义?
  • 是的,如果你想使用一个生成器函数作为 Promise,你需要用 co() 包裹它,就像在 co-pg examples 中一样。在您的情况下,它是co.wrap(),因为您想要返回一个函数(供“以后使用”),而不是“普通”co(),它会立即执行。
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 2019-07-20
  • 2021-02-27
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多