【问题标题】:Backbone-Relational find or load?骨干关系查找或加载?
【发布时间】:2013-12-05 11:12:22
【问题描述】:

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();
        }
    });
}

我猜你可以写一个实用函数,但是有更好的方法吗?好像太啰嗦了。

【问题讨论】:

    标签: javascript backbone.js backbone-relational


    【解决方案1】:

    这实际上看起来像典型的 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 应该返回一个未来/承诺(如果它没有编写一个修复其原型的垫片)。当 promise 解决(返回完成)时,它将调用 doSomething,其范围将绑定到 this。那让你删除自我。

    如何垫片?

    应该是这样的:

    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 方法。然后有成功的选项来解决你的承诺。

    为什么不是内置的?好吧,节点领域的某个人认为承诺不是默认的方式,因此让您陷入回调地狱。

    【讨论】:

    • 在正常情况下使用 try/catch 是非常糟糕的做法。对于不用于正常程序流程的异常情况,应抛出异常来代替 if/else。
    • @jax 不,try/catch 还不错!我不知道你读到了什么让你这么想。
    • 我从没说过 try/catch 不好。但是,不应将 try/catch 用作正常程序流程的一部分。它被称为“异常”的原因是因为它用于异常情况,而不是正常情况。
    • 你的建议没有错,但它不是任何语言的最佳实践,stackoverflow.com/questions/8986958/…
    • @jax 在其下方有一个评分相同的答案,这与您的观点和主要答案相矛盾。 try/catch 是很好的模式。它在学校里教。它具有防御性,可以让您捕获各种错误,并且不会因为不断进行类型检查而使代码混乱。
    【解决方案2】:

    这样怎么样,副作用是找到的对象将更新为服务器上的对象,并且无论如何您都将执行服务器请求。这有点违背缓存的目的。

    this.model = MyModel.findOrCreate({id:id}).fetch({
        success: function(){
            self.doSomething();
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多