将生成器函数作为对象返回而不是实际调用生成器函数

时间:2015-07-30 05:39:27

标签: javascript node.js

出于某种原因,我得到[object Generator]而不是实际调用生成器函数本身。所以对于console.log("结果:" +结果);我知道我正在恢复发电机功能。

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;
};

enter image description here

更新

我首先尝试了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] }

1 个答案:

答案 0 :(得分:1)

调用生成器函数确实会返回生成器,而不是结果。您可以使用app.controller('main',['$scope',function($scope) { $scope.title = ''; }]) .directive('button',['$compile',function($compile) { return { restrict: 'AE', link: function(scope,element) { element.bind('click',function() { var p = $compile('<p ng-bind="title"></p>')(scope); p.insertBefore(element); }); } } }]) 逐步完成生成器。

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

所以你在.next()(添加了carModel.js)中有这个:

co.wrap

然后您的car.find = co.wrap(function *(id) { // your code }); 代码将成为:

gateway.js

您可以在this blogpost中了解更多相关信息。