我希望能够在遵循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
})
答案 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) => {
});