gpt4 book ai didi

javascript - Javascript 中的异步类是个好主意吗?

转载 作者:行者123 更新时间:2023-12-02 14:55:34 24 4
gpt4 key购买 nike

我正在创建一个类,它从数据库中检索信息并适本地设置用户变量。

我的问题是,我使用的数据库 API 是异步的,这成为一个问题,因为该类在“完全构造”之前就可以访问(也就是说构造函数已返回)。

所需的同步方法

class User{
constructor(sql){
this.name = Database.selectQuery(sql);
}
}
var x = new User(statement);
console.log(x.name); // returns name

当前的异步方法

class User{
constructor(sql){
Database.selectQuery(sql, this, function(data, obj){
obj.name = data;
});
}
}
var x = new User(statement);
console.log(x.name); // returns undefined

我知道我可以向构造函数添加回调以使其异步工作,但这是一个好主意吗?

最佳答案

您很快就会发现,所有异步操作在完成时都必须能够与调用者进行通信,因为它们在未来某个不确定的时间完成。这意味着他们要么需要接受回调,要么需要返回一个 promise 。

虽然您可以将回调传递给构造函数,但您不能从构造函数返回 promise (它必须返回对象),因此通常不建议在构造函数中放置异步操作。相反,如果您构造对象然后在对象上调用异步方法,则调用者的代码流会更加简单。

正如您的示例清楚地表明的那样,您没有为 User 对象的调用者创建任何方法来了解构造函数中的异步操作何时完成,因此调用者没有可靠的方法使用该操作的结果。这不仅是一个坏主意,而且完全行不通。您将迫使调用者设置某种超时,并猜测异步操作何时完成或轮询以查找完成 - 这两件事都是不好的事情。

更常见的设计方法是将异步操作分离到一个方法中:

class User{
constructor(){ }

select(sql, callback) {
Database.selectQuery(sql, this, function(data, obj){
obj.name = data;
callback();
});
}

}

var x = new User();
x.select(statement, function() {
console.log(x.name);
});

设计异步接口(interface)的现代方法现在确实正在转向 promise ,它们在错误处理和协调多个异步操作方面提供了显着的优势,因此这确实是我对接口(interface)的推荐。

您上面的界面可能还需要错误处理。

关于javascript - Javascript 中的异步类是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834183/

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