gpt4 book ai didi

javascript - 返回 Promise/具有 .then() 方法的 ES6 类?

转载 作者:行者123 更新时间:2023-11-29 20:48:03 26 4
gpt4 key购买 nike

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

最佳答案

您可以拥有自定义的 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)
})

关于javascript - 返回 Promise/具有 .then() 方法的 ES6 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53557429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com