3

我的 Koa 应用程序中有以下代码:

exports.home = function *(next){
  yield save('bar')
}

var save = function(what){
  var response = redis.save('foo', what)
  return response
}

但我收到以下错误:TypeError: You may only yield a function, promise, generator, array, or object, but the following object was passed: "OK"

现在,“ok”是来自 redis 服务器的响应,这是有道理的。但我无法完全掌握此类功能的生成器的概念。有什么帮助吗?

4

2 回答 2

3

您不会屈服save('bar'),因为SAVE是同步的。(您确定要使用保存吗?)

由于它是同步的,你应该改变它:

exports.home = function *(next){
  yield save('bar')
}

对此:

exports.home = function *(next){
  save('bar')
}

它会阻止执行,直到它完成。

几乎所有其他 Redis 方法都是异步的,因此您需要yield它们。

例如:

exports.home = function *(next){
  var result = yield redis.set('foo', 'bar')
}
于 2015-02-27T21:35:24.370 回答
0

根据文档,产量应该在生成器函数中使用。目的是返回一个迭代的结果以在下一次迭代中使用。

就像在这个例子中(取自文档):

function* foo(){
  var index = 0;
  while (index <= 2) // when index reaches 3, 
                     // yield's done will be true 
                     // and its value will be undefined;
    yield index++;
}

var iterator = foo();
console.log(iterator.next()); // { value:0, done:false }
console.log(iterator.next()); // { value:1, done:false }
console.log(iterator.next()); // { value:2, done:false }
console.log(iterator.next()); // { value:undefined, done:true }
于 2015-02-24T08:04:45.137 回答