Класс ES6, возвращающий Promise / имеющий метод .then ()? - PullRequest
0 голосов
/ 30 ноября 2018

Я бы хотел иметь возможность .then () создавать экземпляр объекта, следуя стандартам Promise.

Или это не рекомендуется?

Я пробовал следующее, но недумаю, что это правильный подход ...

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 голосов
/ 30 ноября 2018

У вас могут быть настраиваемые объекты, но ваши намерения не совсем ясны.Если код должен гарантировать, что экземпляр 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)
})
0 голосов
/ 30 ноября 2018

Вот как вы можете написать обещание

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

  })
 .catch((err) => {
  });
0 голосов
/ 30 ноября 2018

Или это не рекомендуется?

Мало того, что не рекомендуется , но также никогда не будет работать *

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

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

        return value
      })
  }
}
...