首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取作为对象返回的生成器函数,而不是实际调用生成器函数

问获取作为对象返回的生成器函数,而不是实际调用生成器函数
EN

Stack Overflow用户
提问于 2015-07-30 05:39:26
回答 1查看 638关注 0票数 1

由于某些原因,我返回对象生成器,而不是实际调用生成器函数本身。所以对于console.log(“结果:”+结果),我得到了一个生成器函数。

gateway.js

代码语言:javascript
复制
function _find(carId)
{
    var result = _carModel.find(carId);

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

carModel.js

代码语言:javascript
复制
'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

代码语言:javascript
复制
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

代码语言:javascript
复制
'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方法,现在我在终端中获得了这个方法,用于记录您在我的网关函数中看到的结果:

代码语言:javascript
复制
{ _invoke: [Function: invoke] }
{ _invoke: [Function: invoke] }
{ _invoke: [Function: invoke] }
{ _invoke: [Function: invoke] }
EN

回答 1

Stack Overflow用户

发布于 2015-07-30 07:04:04

调用生成器函数确实会返回生成器,而不是结果。您可以使用.next()逐步通过生成器。

但是,听起来您要寻找的是用类似于co.wrap或Q.async的东西包装生成器函数(还有很多其他功能)。它们使您的生成器函数返回与最终结果解决的承诺。

所以您可以在carModel.js中使用这个(添加了co.wrap ):

代码语言:javascript
复制
car.find = co.wrap(function *(id)
{
    // your code
});

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

代码语言:javascript
复制
function _find(carId)
{
    return _carModel.find(carId)
        .then((result) => {
            console.log("results: " + result);
            return result;
        });
}

您可以在这个博客中阅读更多有关它的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31715887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档