Javascript 膝关节炎的函数
我有一个函数,可以从数据库中提取问题集合中的随机问题 Game_Questions.js-console.log下面打印出正确的值(我需要的字符串),所以我认为return会让yield返回相同的值Javascript 膝关节炎的函数,javascript,node.js,mongoose,koa,Javascript,Node.js,Mongoose,Koa,我有一个函数,可以从数据库中提取问题集合中的随机问题 Game_Questions.js-console.log下面打印出正确的值(我需要的字符串),所以我认为return会让yield返回相同的值 exports.random_Question = function *() { yield Questions.findRandom().limit(1).exec(function(err,question){ console.log("rand q: " + question[
exports.random_Question = function *() {
yield Questions.findRandom().limit(1).exec(function(err,question){
console.log("rand q: " + question[0].text);
return question[0].text;
});
}
Game.js:
var Game_Questions = require('./backend/Game_Questions');
在这里,我想访问上面代码片段(Game_Questions.js)中的question[0]。text
value fromrandom_question
函数。到目前为止,我所尝试的:
var found_Question=Game_Questions.random_Question()代码>
var found\u Question=Game\u Questions.random\u Question().next().value代码>
这两个函数返回[Object Object],在使用JSON.stringify()后,它显示该对象是:
{“value”:{“emitter”:{“domain”:null,{u events”:{}},“emitted”:{},“end”:true},“done”:false}
我还尝试使用co(function*())
,但它也不允许我取出值。请帮助访问它? 你的语法很奇怪,但不确定这是否是膝关节炎的特殊性?
由于Node.js是基于事件的,因此请改用回调:
exports.random_Question = function(callback) {
Questions.findRandom().limit(1).exec(function(err, question){
callback(err, question);
});
}
并使用它:
var Game_Questions = require('./backend/Game_Questions');
Game_Questions.random_Question(function(err, question) {
console.log(question);
});
有些问题,你的问题是你试图引用<代码> GAMYQUEST。随机疑问()/>代码>当你的函数实际上被命名为代码> RealthyQuest[</C> > > < /P> < P> > @ ReMUS的答案是回调方法,膝关节炎被明确地设计为去回退。因此,虽然它是一个非常好的代码,适合于一个快速的应用程序,但它完全与膝关节炎的设计理念不一致。
从外观上看,您使用的是Mongoose,它从4.0版(2015年4月发布)开始就支持异步操作,这应该允许采用收益率方法。请注意,我假设您正在与猫鼬合作-我希望我没有错
因此,首先确保您使用的是支持使用yield的Mongoose版本。如果没有,您将不得不使用@remus方法或手动包装您的每个方法,以使它们与产量兼容(即使用承诺包装)
但是,如果您使用的是兼容版本(4.0及以上),那么您的代码将如下所示:
exports.random_Question = function *() {
var result;
try {
result = yield Questions.findRandom().limit(1).exec();
} catch(e) {
console.log(e.stack);
throw e;
}
console.log("rand q: " + result[0].text);
return result[0].text;
}
注意,我假设结果是基于您提供的代码的数组
上面的例子不一定是一个生成器函数。它也可以是一个返回承诺的普通函数。因此,也可以做类似的事情:
exports.random_Question = function() {
return Questions.findRandom()
.limit(1)
.exec()
.then(function() {
// I'm assuming mongoose assigns the value
// being resolved in exec() to 'this'
var question = this[0];
console.log("rand q: " + question.text);
return question.text;
}).catch(function(e) {
console.log(e.stack);
throw e;
});
}
<> P> >对于<代码>随机化问题< /C>函数,重要的是它可以由 CO.<代码>产生,它处理膝关节炎应用程序流控制——检查您可以产生的不同对象。
<>最后,回到膝关节炎中间件,我们可以用完全相同的方式<代码>屈服率>代码段。所以我们要做:
var koa = require("koa");
var app = module.exports = koa();
var Game_Questions = require('./backend/Game_Questions');
app.use(function*() {
var resultText;
try {
resultText = yield Game_Questions.random_Question();
} catch(e) {
this.throw(500);
}
this.body = resultText;
this.status = 200;
});
app.listen(3000);
另外需要注意的是,我有点不确定mongoose查询中的findRandom
方法,因为我不知道它是否与mongoose的Promise特性配合得很好。就我个人而言,在重新引入findRandom
之前,我会使用yield
实现一个正常的mongoose查询,以确保它不会引起问题
我的答案在这一点上有点长了,所以我就到此为止。嗨,非常感谢@remus,我犯了严重的语法错误,所以是的,应该有随机的问题,但它给了我[对象]
。当我尝试您的解决方案时,questionText未定义,可能是因为console.log在random\u Question()
之前运行。如果Question[0].text不存在,这将导致未定义。当您在findRandom()
的回调函数中记录question
时会发生什么情况?然后它会记录正确的值-在您的解决方案和我的示例中,以及生成器函数中@雷姆斯哇,你太棒了!:)它就像一个符咒。谢谢。很抱歉,我的语法很奇怪,仍在进行基础工作。您将始终需要使用回调,因为它是异步的co(Game_Questions())
应该会返回一个关于iirc值的承诺。您好@Peadar Doyle,您说得对,我在我的项目中运行Mongoose,它是4.0.7版本,所以应该支持yield。我之所以使用questions[0].text
是因为questions
是一个对象的猫鼬数组,我想要“text”的值,所以我想我可以通过这种方式访问它。我尝试了您的解决方案,但我不确定如何在另一个文件中调用此函数<代码>游戏问题。随机问题().next().value代码>和变量博弈问题。随机问题()我已经更新了我的答案。了解 CO/< COD> > <代码>生成器< /> >和承诺> /COD> COA中的工作是学习膝关节炎的最严峻挑战。不幸的是,这些也提供了所有的优势,膝关节炎;所以你不能掩饰它们。谢谢你提供了非常翔实的答案。我可以看到我现在面临的问题——我的示例(Game.js文件)只是整个方法的一个片段,其中包含许多标准(而不是生成器)函数。我知道我应该用膝关节炎标准来做,所以我现在不会面对这个问题。我将尝试重写我的函数,并用结果更新您。谢谢你的乳液我印象深刻,它真的很有效。两个答案都是正确的,但你的答案显然更好,因为koa风格和使用发电机。谢谢。如果有人感兴趣,你可以。