获取生成器函数作为对象返回,而不是实际调用生成器函数
出于某种原因,我得到[对象生成器]返回,而不是实际调用生成器函数本身。 所以对于console.log(“结果:”+结果); 我得到,我回来了发电机function。
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; };
UPDATE
我首先尝试了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; });
它从来没有再次打我的查找方法,我现在得到这个在terminallogging的结果,你看到我的网关function:
{ _invoke: [Function: invoke] } { _invoke: [Function: invoke] } { _invoke: [Function: invoke] } { _invoke: [Function: invoke] }
调用一个生成器函数确实返回一个生成器,而不是结果。 您可以使用.next()
浏览生成器。
但是这听起来像你正在寻找的是包装你的生成器函数像co.wrap或Q.async (还有很多其他)。 他们让你的生成器函数返回一个Promise来解决最终的结果。
所以你可以在carModel.js
(加上co.wrap
join这个:
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; }); }
你可以阅读更多关于它在这个博客 。