Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6类返回承诺/具有.then()方法?_Javascript_Ecmascript 6_Es6 Promise_Es6 Class - Fatal编程技术网

Javascript ES6类返回承诺/具有.then()方法?

Javascript ES6类返回承诺/具有.then()方法?,javascript,ecmascript-6,es6-promise,es6-class,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.load

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

还是不建议这样做

这不仅是不推荐的,而且也会

您应该只使用
构造函数
来定义初始状态值或 执行施工价值验证等

您可以使用
init()
方法来执行所需操作,如下所示:

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

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

        return value
      })
  }
}

您可以拥有自定义的对象,但您的意图并不十分清楚。如果代码应确保
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)
})

这就是你写承诺的方式

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

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

我猜扩展承诺不再需要了?我稍微改变了我的问题,以表明内部回调不是承诺,但您的答案仍然是correct@t.nieseCopypasta输入错误。@Mojimi内部回调使用的异步样式并不重要。如果我错了,请纠正我,但我认为问题基本上可以归结为“我可以有一个异步构造函数吗?”。我只是想。然后()在遵循promise标准的同时,这就是为什么我认为我需要扩展promise,因为这样返回的对象也将是一个promise,但我在思考中迷失了方向如果您对实例的对象不感兴趣,那么为什么需要
MyClass
?给定的代码可以使用函数和闭包来解决。@t.niese是的,只是不在这段特定的代码中,只是为了展示我所看到的语法,这是一个无用的示例for@Mojimi附带问题,但您为什么要扩展
承诺
MyClass
在您的系统中应该做什么?另外,.您可以拥有自定义的
然后
可编辑对象,但您的意图并不十分清楚。如果代码应确保
MyClass
的实例在使用前已准备就绪,则应使用工厂函数在对象准备就绪后立即返回该对象,或者如果某些函数依赖于异步加载,则应使这些函数也异步。在解析之前,then-able对象不会阻止您使用,因此设计不会在可维护性或错误安全性方面帮助您。
myClass.load().then()
(new myClass())。then()
在可维护性和错误安全性方面是相同的。在这两种情况下,您必须确保使用代码的人知道
myClass
在调用
then
之前不得使用,这是一种糟糕的方法。
.load()
/
init()
可能更糟糕,因为用户需要知道
new
不会初始化对象。因此,考虑到所有内容都是按需加载的模块,我是否会有一个加载程序模块/类作为所有其他模块/类的工厂?@Mojimi,它实际上严重依赖于您的总体代码结构。从显示的代码中,我怀疑您是否需要一个实际的类,因为您只使用
结果
,而
加载的
并不是真正需要的,因为该信息已由承诺状态保存。
const someAsyncFunction = (parameters) => {
  return new Promise((resolve, reject) => {
    if (success) {
      resolve();
    } else {
      reject();
    }
  });
};
someAsyncFunction
 .then((result) => {

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