Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干关系查找还是加载?_Javascript_Backbone.js_Backbone Relational - Fatal编程技术网

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有一个与您的观点和主要答案相矛盾的答案,在该答案的正下方有一个评分相等的答案。试一试是很好的模式。它是在学校里教的。它是防御性的,可以让您捕获各种错误,并且不会因为类型检查而使代码变得杂乱无章。