2014-01-24 55 views
1

我以Backbone开始,并且正在撰写手机销售应用程序。但我的疑问是关于JavaScript执行流程。误解JavaScript执行流程

的situacion是,我有一个自定义的方法来拒绝我的购物车收集的重复,这些方法是这样的:

var Cart = Backbone.Collection.extend({ 
      contains : function(aProduct){ 
       _.each(this.models, function(element, index, list){ 
        if(element.get('product').get('id') == aProduct.get('id')){ 
         return true; 
        } 
       }); 
       return false; 
      } 
     }); 

该方法检测的重复,并试图返回true,但该行ISN最后一个,因为最后执行的声明是“返回错误”。在这一点上,我意识到我在这个JavaScript执行流程中有一个误解。

也许你可以ENLIGHT我与你的知识

感谢

+0

东西在里面可能是异步的,即时通讯不太熟悉Backbone,所以不确定它是哪一个。 – tymeJV

回答

0

您从您传递到_.each函数返回true。这与你的包含函数不同。这是一种方式来获得它的工作:

var Cart = Backbone.Collection.extend({ 
      contains : function(aProduct){ 
       var doesContain = false; 
       _.each(this.models, function(element, index, list){ 
        if(element.get('product').get('id') == aProduct.get('id')){ 
         doesContain = true; 
        } 
       }); 
       return doesContain; 
      } 
     }); 

然而,更好的方法(假设是lodash或下划线),是使用_.any

var Cart = Backbone.Collection.extend({ 
      contains : function(aProduct){ 
       return _.any(this.models, function(element){ 
        if(element.get('product').get('id') == aProduct.get('id')){ 
         return true; 
        } 
       }); 
      } 
     }); 
+0

更好的方法是使用'_.contains':p – david

+0

这可能不适用于这种情况,因为它们不太可能是同一个对象。而是两个相同的对象。 –

+0

感谢Matt和@David,我没有意识到这一点。愚蠢的错误 – Franco