具有异步例程的新对象

new object with async routines

我想实例化一个对象,构造函数在返回之前执行异步调用。目的是进行异步柯里化。我正在使用 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

A new 运算符将始终 return 一个对象立即同步。您不能延迟该操作。

您可以改为创建一个函数,该函数将为您的对象return一个 Promise。

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

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

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