【问题标题】:new object with async routines具有异步例程的新对象
【发布时间】:2017-01-04 11:19:32
【问题描述】:

我想实例化一个对象,构造函数在返回之前执行异步调用。目的是进行异步柯里化。我正在使用co。以下示例失败。我做错了什么?

var co = require('co')

function asyncFunction() { 
  return new Promise(function (resolve) {
    resolve()    
  })
}

function MyObject () {
  co(function * () {
    yield asyncFunction()
  }).then(()=> {
    this.runSomething = function() {
      return 'something'
    }
  })
}

new MyObject().runSomething()
// TypeError: (intermediate value).runSomething is not a function

【问题讨论】:

  • co 返回一个 Promise,您无法解析。
  • 当你看到一个没有任何回调的纯点符号序列的属性(如new MyObject().runSomething()),它是同步的。您需要在主代码中进行回调。
  • 别这样!允许new MyObject() 完全同步,并将任何异步的东西降级到 MyObject() 的方法。
  • 这就是我所做的@Roamer。谢谢。

标签: javascript node.js promise co


【解决方案1】:

new 运算符总是会立即同步返回一个对象。您不能延迟该操作。

您可以改为创建一个为您的对象返回 Promise 的函数。

function makeObjectAsync() {
  const asyncResult = asyncOperation();
  return asyncResult.then(result => ({
    runSomething() { /* ... */ }
  }));
}

myObjectAsync()
  .then(obj => {
    // obj is ready to use.
    return obj.runSomething();
  });

你可以很容易地将它与co 结合起来阅读一些.then()s。

【讨论】:

  • 谢谢。我怀疑这是使用 new 时的唯一途径。
猜你喜欢
  • 2019-02-09
  • 2021-08-21
  • 2017-12-02
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多