ES6 Class 返回 Promise/having .then() 方法?
ES6 Class returning Promise/having a .then() method?
我希望能够在遵循 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
})
Or is this not recommended?
不仅不推荐而且 .
您应该只使用 constructor
来定义初始状态值或
执行构造值验证等
您可以使用 init()
方法来执行您想要的操作:
class MyClass {
constructor(){
this.loaded = false
}
init() {
return someAsyncFunction()
.then(value => {
this.loaded = true
return value
})
}
}
您可以拥有自定义的 then-able 对象,但您的意图不是很清楚。如果代码应确保 MyClass
的实例在您使用它之前就绪,那么您应该使用工厂函数在它准备好后立即返回该对象,或者如果某些函数依赖于异步加载,则使这些函数异步也是。
then-able 对象在它被解析之前不会阻止您使用,因此该设计不会帮助您实现可维护性或错误安全性。
工厂函数:
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) => {
});
我希望能够在遵循 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
})
Or is this not recommended?
不仅不推荐而且
您应该只使用 constructor
来定义初始状态值或
执行构造值验证等
您可以使用 init()
方法来执行您想要的操作:
class MyClass {
constructor(){
this.loaded = false
}
init() {
return someAsyncFunction()
.then(value => {
this.loaded = true
return value
})
}
}
您可以拥有自定义的 then-able 对象,但您的意图不是很清楚。如果代码应确保 MyClass
的实例在您使用它之前就绪,那么您应该使用工厂函数在它准备好后立即返回该对象,或者如果某些函数依赖于异步加载,则使这些函数异步也是。
then-able 对象在它被解析之前不会阻止您使用,因此该设计不会帮助您实现可维护性或错误安全性。
工厂函数:
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) => {
});