ES6 Class 返回 Promise/having .then() 方法?

ES6 Class returning Promise/having a .then() method?

我希望能够在遵循 Promise 标准的同时 .then() 实例化对象。

或者不推荐这样做?

我尝试了以下方法,但我认为这不是正确的方法...

class MyClass extends Promise {
  constructor(){
    this.loaded = false;
    //Non promise third-party callback async function 
    someAsyncFunction( result => {
      this.loaded = true;
      this.resolve(result);
    }
  }
}

const myClass = new MyClass();
myClass.then( result => {
  console.log(result);
  console.log(myClass.loaded);
  // >>true
})

编辑:

我最终做的是以下内容,但我不确定是否使用 .load().then()

class MyClass {
  constructor(){
    this.loaded = false;
  }
  load(){
    return new Promise( resolve => {
      //Non promise third-party callback async function 
      someAsyncFunction( result => {
        this.loaded = true;
        resolve(result);
      }
    })
  }
}

const myClass = new MyClass();
myClass.load().then( result => {
  console.log(result);
  console.log(myClass.loaded);
  // >>true
})

Or is this not recommended?

不仅不推荐而且.

您应该只使用 constructor 来定义初始状态值或 执行构造值验证等

您可以使用 init() 方法来执行您想要的操作:

class MyClass {
  constructor(){
    this.loaded = false
  }

  init() {
    return someAsyncFunction()
      .then(value => {
        this.loaded = true

        return value
      })
  }
}

您可以拥有自定义的 then-able 对象,但您的意图不是很清楚。如果代码应确保 MyClass 的实例在您使用它之前就绪,那么您应该使用工厂函数在它准备好后立即返回该对象,或者如果某些函数依赖于异步加载,则使这些函数异步也是。

then-able 对象在它被解析之前不会阻止您使用,因此该设计不会帮助您实现可维护性或错误安全性。

工厂函数:

function createMyClass(options) {
     const myClass = new MyClass();
     return loadData(options).then( (result) => {
         myClass.loaded = true;
         myClass.result = result;

         return myClass;
     }) 
}


createMyClass({/*some options*/}).then( myClass => {
  console.log(myClass.result);
  console.log(myClass.loaded);
})

按需加载结果:

class MyClass {
  constructor(options) {
    this.loaded = false;
    this.options = options;
  }

  result() {
    // only request the data if it was not already requested
    if (!this._result) {
      this._result = loadData(this.options).then(result => {
        this.loaded = true
        return result
      });
    }
    return this._result
  }
}


var myClass = new MyClass({/*....*/})

myClass.result().then(result => {
   console.log(result)
})

// could be called another time, and the data is not requested over again,
// as the Promise is reused
myClass.result().then(result => {
   console.log(result)
})

你可以这样写承诺

const someAsyncFunction = (parameters) => {
  return new Promise((resolve, reject) => {
    if (success) {
      resolve();
    } else {
      reject();
    }
  });
};
someAsyncFunction
 .then((result) => {

  })
 .catch((err) => {
  });