Javascript 主干关系查找还是加载?
主干关系中的模型缓存非常好,但是安全地加载简单模型需要相当多的代码。例如Javascript 主干关系查找还是加载?,javascript,backbone.js,backbone-relational,Javascript,Backbone.js,Backbone Relational,主干关系中的模型缓存非常好,但是安全地加载简单模型需要相当多的代码。例如 // 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
// 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();
}
});
}
我想你可以写一个实用函数,但肯定有更好的方法吗?这看起来太冗长了。这看起来像是典型的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)
);
}
}
这里发生了什么事?
Try/Catch是一种很好的方式,它可以让你注意到某些东西没有被发现或不存在。如果捕获到错误,则可以获取。Fetch应该返回一个future/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可能指向原始的主干fetch。实际上,您希望在选项和范围中调用主干关系获取方法pass。然后,你可以选择成功来解决你的承诺
为什么这不是内置的?node land中的某个人认为承诺不是默认的方式,因此将您置于回拨地狱中。这样做如何,副作用是找到的对象将更新为服务器上的对象,并且您将执行服务器请求。这有点违背了缓存的目的
this.model = MyModel.findOrCreate({id:id}).fetch({
success: function(){
self.doSomething();
}
});
在正常情况下使用try/catch是非常糟糕的做法。对于正常程序流中没有使用的异常情况,应该抛出异常来代替if/else。@jax否,try/catch还不错!我不知道你读到什么让你这么想。我从来没有说过尝试/抓住是不好的。但是,try/catch不应作为正常程序流的一部分使用。它之所以被称为“异常”,是因为它用于异常情况,而不是正常情况。您的建议没有错,但它不是任何语言的最佳实践,@jax有一个与您的观点和主要答案相矛盾的答案,在该答案的正下方有一个评分相等的答案。试一试是很好的模式。它是在学校里教的。它是防御性的,可以让您捕获各种错误,并且不会因为类型检查而使代码变得杂乱无章。