【问题标题】:generators, promises and co or then-yield生成器、promise 和 co 或 then-yield
【发布时间】:2016-02-25 02:03:03
【问题描述】:

我正在编写一个 nodejs 程序,需要在初始化期间获取一些配置数据,以便实例化一个单例。配置数据作为承诺返回,这意味着我必须即时初始化事物,而不是在需要的时候,所以我可以module.exports = () => return new blah(config)。我不希望工厂返回 thenable - 我希望它返回构造函数的新实例。

我有一个获取配置数据并返回承诺的内部库。我正在尝试使用cothen-yield 或类似的库,以便我可以将事物视为同步的(我认为这就是这些库的用途,但也许我的理解有缺陷),主要是这样我可以创建一个返回实例的工厂,并且不返回与实例解析的承诺

简化代码:

配置阅读器:

var read = function () {
  let c = projectConfig.load(); //returns a promise that resolves with config data
  return c;
});

module.exports = {read};

工厂:

let factory = ty.async(function * factory () {
  let cfg = yield configHelper.read();
  console.log('config', cfg)
  return new Constructor(cfg);
})

module.exports = () => factory()

索引:

let factory = require('factory')()
console.log(factory)

当我运行程序时,我得到以下输出

Promise {
    _d: {
        p: [Circular],
        c: [],
        a: undefined,
        s: 0,
        d: false,
        v: { cdn: [Object] },
        h: false,
        n: false
    }
} // this is from the main module

config { /* correct config object data here */ } //this is from factory

查看各种讨论此问题的博客文章,我希望通过使用 then-yield 或 co,factory 应该返回具有正确配置参数的构造函数。但看起来它 co 或 ty 什么都不做,我得到了产量结果。

我误解了什么?

【问题讨论】:

  • 不,这不是co 等工作的方式。你无法克服异步,结果永远不会立即可用(同步返回),你总是会得到一个承诺。您的模块需要导出一个承诺,您可以在需要承诺的地方使用co

标签: javascript node.js promise generator


【解决方案1】:

我误解了什么?

async 函数的结果将只是一个 Promise。因此,您只能使用 then 处理程序访问 async 函数的结果值。

在你的情况下,

let factory = require('factory')()

factory.then((consObj) => // use the Constructor object)

【讨论】:

  • 是的,我害怕那个。我真的不喜欢工厂返回一个 thenable 但没有某种配置服务我看不到解决它的方法。
猜你喜欢
  • 1970-01-01
  • 2015-05-25
  • 2020-04-07
  • 2021-09-05
  • 1970-01-01
  • 2017-07-07
  • 2019-03-07
  • 2016-12-02
  • 1970-01-01
相关资源
最近更新 更多