【发布时间】:2015-05-01 16:20:02
【问题描述】:
想想 Rails 如何,例如允许您将一个属性定义为与另一个相关联:
class Customer < ActiveRecord::Base
has_many :orders
end
这不会为orders 设置数据库列。相反,它为orders 创建了一个getter,它允许我们这样做
@orders = @customer.orders
去获取相关的orders 对象。
在 JS 中,我们可以使用 getter 轻松做到这一点:
{
name: "John",
get orders() {
// get the order stuff here
}
}
但是 Rails 是 sync,而在 JS 中,如果在我们的示例中,按照合理的方式,我们要访问数据库,我们会这样做 async。
我们将如何创建异步 getter(和 setter)?
我们会返回一个最终得到解决的承诺吗?
{
name: "John",
get orders() {
// create a promise
// pseudo-code for db and promise...
db.find("orders",{customer:"John"},function(err,data) {
promise.resolve(data);
});
return promise;
}
}
这将允许我们这样做
customer.orders.then(....);
或者我们会做更多的角度风格,我们会自动将其解析为一个值?
总而言之,我们如何实现异步 getter?
【问题讨论】:
-
我想不出除了返回承诺之外的任何其他方式。
-
可能是
yield的生成器? -
@elclanrs: AFAIK getter 不能成为生成器。
-
这是我的观点,也许我对 JS 很老套,但如果里面有动词,我想在调用签名中看到动词(如 get)或括号。我认为通过隐藏括号,您可以使它看起来像 RAM 数据对象的同步读取,但事实并非如此。
customer.orders.then(....);会更直观(对我来说)customer.getOrders().then(....);、customer.orders.get(fnThen_or_callBack);、customer.orders(fnThen_or_callBack);,或者只是customer.orders().then(....);。在所有这些情况下,我一眼就能看出正在发生的事情超出了简单的阅读范围。 -
@trusktr 令人印象深刻。 JS 的一大优势一直是它的异步性。它最大的弱点之一一直是它无法在需要时真正进行同步。这肯定会有所帮助。
标签: javascript promise