我将每个路由器模块包裹在下面IndexBase.js
,
如果我想要一个像othercrudmodule.js
这样的模块,
并且这些函数也必须以承诺执行,
我尝试在co
中使用othercrudmodule.js
,但我知道绝对没有工作
如何正确地构建它?
IndexBase.js
var co = require('co');
var othercrudmodule = require('../../CustomModules/othercrudmodule');
router.get('/q', function(req, res, next) {
domain.run(function() {
var dbClient = req.app.get('dbClient');
// some promise crud database function ..
// ..
co(function *() {
// yield promise crud database function
// **should I use yield here too? or ?
// How to get sync result here with selectAll**
var othercrudmoduleResult = yield othercrudmodule(dbClient).selectAll();
// render result
}).catch(onerror);
function onerror(error) {
console.error(error.stack);
res.send(error.stack);
}
});
domain.on('error', function(error) {
console.error(error.stack);
res.send();
});
});
module.exports = router;
othercrudmodule.js
var co = require('co');
var othercrudmodule = function(dbClient) {
// some promise crud database function ..
var selectArticle = function() {
return new Promise(function (fulfill, reject){
var domainB = require('domain').create();
domainB.on('error', function(error) { domain.emit('error', error); });
domainB.run(function() {
var query = 'SELECT * FROM "Tag0" ORDER BY "Name"';
dbClient.Article.query(query,[], function(error, result) {
var o = {};
if (error != null) {
o.error = error;
fulfill(o);
} else {
o.result = result;
fulfill(o);
}
});
});
});
};
// ... more promise crud database function ..
var selectAll = function() {
// **should I use co and yield in this module ?? I want selectAll return sync result**
// co(function *() {
// .... yield promise crud database function ??
var o = [];
var selectArticleResult = selectArticle();
// console.log(selectArticle1Tag0Result);
o.push(selectArticleResult.result.rows);
return o;
// }).catch(onerror);
// function onerror(error) {
// console.error(error.stack);
// res.send(error.stack);
// }
};
var o = {};
o.selectAll = selectAll;
return o;
};
module.exports = othercrudmodule;
更新
selectAll
函数没有承诺,所以我得到异步结果?那怎么解决呢?
现在我使用yield othercrudmodule(dbClient).selectArticle()
获取正确的同步结果,但那不是我想要的......
我想使用othercrudmodule(dbClient).selectAll()
,模块中的函数用数据库函数执行一些crud然后返回同步结果。