Backbone-Relational中的模型缓存非常好,但要安全地加载一个简单的模型需要相当多的代码。 E.g。
// Try and find a model in the Cache
this.model = MyModel.find({id:id});
if(this.model){
// Model loaded from cache, do something.
this.doSomething();
}else{
// Load model then do something on success.
var self = this;
this.model = new MyModel({id:id});
this.model.fetch({
success: function(){
self.doSomething();
}
});
}
我想你可以写一个实用功能,但是有一个更好的方法吗?这似乎太长了。
答案 0 :(得分:0)
这看起来像是典型的mysql / db工作。
您可能希望以不同的方式构建它:
this.model = MyModel.find({id:id});
try {
this.doSomething();
} catch (e) {
if (e instanceof SomeSpecificException) {
var fetchPromise = this.model.fetch();
fetchPromise.done(
this.doSomething.bind(this)
);
}
}
尝试/捕捉是一种很好的方式来注意到找不到或不存在的东西。如果你发现错误,那么你可以获取。 Fetch应该返回future / promise(如果它没有编写修复其原型的垫片)。当promise解决(返回完成)时,它将调用doSomething,其范围将绑定到此。那就让你自我消除。
它类似于:
var Deferred = require('simply-deferred');
Backbone.Model.prototype.fetch = function(options) {
var dfd = Deferred();
Backbone.Model.prototype.fetch.call(
this,
_.extend({ success: dfd.resolve.bind(this) }, options)
);
return dfd.promise;
}
我不确定的唯一部分是使用哪个函数:Backbone.Model.prototype.fetch可能指向原始的Backbone fetch。您基本上希望在选项和范围中调用Backbone-Relational fetch方法。然后有成功的选择来解决你的承诺。
为什么不内置?那么节点土地上的某个人决定承诺并不是默认的方式,因此让你回到地狱。
答案 1 :(得分:0)
这样做的副作用是找到的对象将更新到服务器上的对象,无论如何都会执行服务器请求。它有点挫败了缓存的目的。
this.model = MyModel.findOrCreate({id:id}).fetch({
success: function(){
self.doSomething();
}
});