gpt4 book ai didi

javascript - 获取生成器函数的值,koa

转载 作者:行者123 更新时间:2023-11-30 12:19:16 24 4
gpt4 key购买 nike

我有一个函数可以从数据库中提取问题集合中的随机问题。

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[0].text);
return question[0].text;
});
}

Game.js:

var Game_Questions = require('./backend/Game_Questions');

在这里,我想从上面代码片段 (Game_Questions.js) 的 random_Question 函数访问 question[0].text 值。到目前为止我尝试了什么:

var found_Question = Game_Questions.random_Question();

var found_Question = Game_Questions.random_Question().next().value;

这两个返回 [Object object] 在使用 JSON.stringify() 后显示对象是:{"value":{"emitter":{"domain":null,"_events":{}},"emitted":{},"ended":true},"done":false}

我也尝试过使用 co(function*()) 但它也没有让我取出值。请帮助如何访问它?

最佳答案

@remus 的答案是回调方法,而 Koa 被明确设计为放弃回调。因此,尽管它是非常好的代码并且适合 Express 应用程序,但它与 Koa 背后的设计理念完全不一致。

从外观上看,您使用的是 Mongoose,它从 4.0 版(2015 年 4 月发布)开始就支持异步操作的 promise ,这应该允许采用 yield 方法。请注意,我假设您正在使用 Mongoose - 希望我没有错!

Here is some nice documentation on how Mongoose would fit nicely with koa.

因此,首先确保您使用的是支持使用 yield 的 Mongoose 版本。如果不是,您将不得不使用 @remus 方法或手动包装您的每个方法,以便它们产生兼容(即包装 promise )。

但是如果您使用的是兼容版本(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;
}

请注意,我假设结果是一个基于您提供的代码的数组。

上面的例子不一定是生成器函数。它也可以是一个返回 Promise 的普通函数。所以也可以做这样的事情:

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

因此对于 randomQuestion 函数来说,所有重要的是它可以由处理 Koa 应用程序流控制的 co 产生——检查 tj/co on GitHub对于您可以产生的不同对象。

所以最后回到 Koa 中间件,我们可以以完全相同的方式yield上述任何一个代码片段。所以我们会这样做:

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 查询,只是为了确保它不会引起问题。

我的回答现在有点长,所以我就此打住。

关于javascript - 获取生成器函数的值,koa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31553538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com