Javascript ES6类返回承诺/具有.then()方法?
我希望能够在遵循Promise标准的同时将.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
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) => {
});