ES6类返回Promise /是否具有.then()方法?

时间:2018-11-30 12:16:22

标签: javascript ecmascript-6 es6-promise es6-class

我希望能够在遵循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
})

3 个答案:

答案 0 :(得分:1)

  

还是不建议这样做?

不仅不建议 使用,而且还会 never work

您应仅使用constructor定义初始状态值,或 进行建筑价值验证等。

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

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

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

        return value
      })
  }
}

答案 1 :(得分:1)

您可以具有自定义的然后可用的对象,但是意图并不十分清楚。如果代码在使用前确保MyClass实例已准备就绪,则应使用工厂函数,在准备就绪后立即返回该对象,或者如果某些函数依赖于异步加载,则使这些函数也异步。

然后可用的对象不会阻止您在解决该问题之前使用它,因此设计对您的可维护性或错误安全性没有帮助。

工厂功能:

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)
})

答案 2 :(得分:0)

这是您写诺言的方式

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

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