【问题标题】:Bluebird Error: Generator Function Must Be A Function [closed]蓝鸟错误:生成器函数必须是函数[关闭]
【发布时间】:2016-05-23 22:38:35
【问题描述】:

我收到错误:

bluebird.js:2118 Uncaught TypeError: generatorFunction must be a function

但我不明白为什么会发生此错误,因为我将它传递给 generatorFunction。

export class Welcome {
    fetch() {
      Promise.coroutine(this.userData());
    }

    userData = function* getData() {
     this.lotsData = yield this.testApi.getMock();
     this.lotsData = JSON.stringify(this.lotsData, null, 4);
    }
}

所以点击事件调用 fetch() 并调用 this.userData()。这是 this.userData 的控制台转储:

GeneratorFunctionPrototype {}
_invoke: invoke(method, arg)
__proto__: GeneratorFunctionPrototype

这告诉我它肯定是一个生成器。如果这有什么不同的话,我会在 aurelia 类中使用所有这些(我不认为它不应该)。那么为什么生成器函数必须是一个函数会出错呢?

【问题讨论】:

  • 报错的行号是多少?
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。 See: How to create a Minimal, Complete, and Verifiable example.
  • 你真正想要的是fetch = Promis.coroutine(userData)

标签: javascript promise generator bluebird


【解决方案1】:

您发布的代码数量有限,错误百出,但还不足以知道什么是正确的,什么是不正确的。

有一点可以肯定,this.userData() 是一个函数调用,而不是对函数的引用,这是 .coroutine() 所期望的。

this.testApi.getMock() 返回的任何类型都是yielded,鉴于您发布的内容,我们不知道,但此时可能甚至不相关,因为返回的可能是unknown/ null 无论如何,因为您将 yield 分配给有问题范围的变量。您的代码与文档中的示例相去甚远

PingPong.prototype.ping = Promise.coroutine(function* (val) {
    console.log("Ping?", val)
    yield Promise.delay(500)
    this.pong(val+1)
});

documentation 有一个非常清晰且定义明确的示例,您应该明确地遵循,直到您了解自己实际在做什么。

【讨论】:

  • 我明白你的意思。我会尝试多玩一些。
  • 实际上this.testApi.getMock() 有效。它只是另一个已导入的类,它从获取中返回一个承诺。除了Promise.coroutine(this.userData());,我不确定还存在什么其他错误。如果我编写自己的生成器运行器,我可以让它正常工作。我试图用 Bluebirds 代替我的自定义生成器运行器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2017-01-11
  • 2018-01-21
  • 2012-07-26
  • 2015-12-31
  • 2023-01-29
相关资源
最近更新 更多