主干关系查找或加载



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.
    var self =  this;
    this.model = new MyModel({id:id});
    this.model.fetch({
        success: function(){
            self.doSomething();
        }
    });
}

我想你可以写一个效用函数,但奇怪的是,有更好的方法吗?这似乎太冗长了。

怎么样,副作用是找到的对象将更新为服务器上的对象,而不管怎样,您都将执行服务器请求。它有点违背了缓存的目的。

this.model = MyModel.findOrCreate({id:id}).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(如果它没有编写修复其原型的填充程序)。当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获取。本质上,您希望在选项和范围中调用Backbone Relational fetch方法。然后有成功的选择来实现你的承诺。

为什么这不是内置的?节点之地的某个人决定承诺不是默认的方式,因此让你陷入了地狱般的回调。

相关内容

  • 没有找到相关文章

最新更新