更好地理解javascript';s产量 我在膝关节炎应用程序中有以下代码: exports.home = function *(next){ yield save('bar') } var save = function(what){ var response = redis.save('foo', what) return response }
但是我得到了以下错误:更好地理解javascript';s产量 我在膝关节炎应用程序中有以下代码: exports.home = function *(next){ yield save('bar') } var save = function(what){ var response = redis.save('foo', what) return response },javascript,generator,koa,Javascript,Generator,Koa,但是我得到了以下错误:TypeError:您可能只生成一个函数、承诺、生成器、数组或对象,但传递了以下对象:“OK” 现在,“ok”是来自redis服务器的响应,这很有意义。但是我不能完全掌握这类函数的生成器的概念。有什么帮助吗?根据下面的说明,应该在生成器函数中使用Yield。 其目的是返回迭代的结果,以便在下一次迭代中使用 如本例所示(摘自文档): 函数*foo(){ var指数=0; while(index您不会生成save('bar'),因为它是同步的。(确实要使用save吗?) 由于它
TypeError:您可能只生成一个函数、承诺、生成器、数组或对象,但传递了以下对象:“OK”
现在,“ok”是来自redis服务器的响应,这很有意义。但是我不能完全掌握这类函数的生成器的概念。有什么帮助吗?根据下面的说明,应该在生成器函数中使用Yield。 其目的是返回迭代的结果,以便在下一次迭代中使用 如本例所示(摘自文档):
函数*foo(){
var指数=0;
while(index您不会生成save('bar')
,因为它是同步的。(确实要使用save吗?)
由于它是同步的,您应该更改以下内容:
exports.home = function *(next){
yield save('bar')
}
为此:
exports.home = function *(next){
save('bar')
}
它将阻止执行,直到完成
几乎所有其他Redis方法都是异步的,因此您需要产生它们
例如:
exports.home = function *(next){
var result = yield redis.set('foo', 'bar')
}
谢谢你的回答。函数调用实际上在一个生成器函数中,只是忘记了编写它。请检查我的编辑。你使用的是哪个redis软件包?我猜你使用的是常规的redis npm模块,它需要回调。请尝试返回承诺的co-redis。哦,不,我使用的是coRedis,连接的代码是以下内容:var-redis=require(“redis”)、coRedis=require(“co-redis”)、db=redis.createClient()、dbCo=coRedis(db);module.exports=dbCo;
(在另一个文件中)感谢您的澄清。因此,在这种情况下,我不应该使用收益率。如果我想做一个var-res=get('foo')呢;this.body=res
?我不也需要调用的收益率吗?您需要生成异步函数(这是Redis'API的大部分)。我认为save
同步(一种特殊情况)让您感到困惑。既然Redis'GET是异步的,那么您将生成它:var res=yield Redis.GET('foo'))
。我只知道redis.save是同步的,因为它在文档页面上用粗体字表示:。这有点像节点的var text=fs.readFileSync('README.md')
(同步)与fs.readFile('README.md',function(text){…})
(异步)之间的区别。这更有意义吗?
exports.home = function *(next){
var result = yield redis.set('foo', 'bar')
}