2012-03-20 53 views
0

我想在服务器端(使用Nodejs)使用“所有”的骨干,并被困在做一个适当的验证。结合异步代码和syncronous框架

问题是backbone的验证方法返回一个布尔值,验证机制应该在里面实现,但是对于节点,这些机制是异步的,因此验证方法在评估我的代码之前返回。

这里是一个很好地说明了我的设置代码示例:

Backbone.Model.extend({ 
    validate: function(){ 
    var result; 
    Jobs._withCollection(function(err, collection){ 
     collection.count(query, function(count){ 
     result = count > 1 ? "Job already exist" : null; 
     }); 
    }) 
    return result; 
    } 
}) 

我也许能改善这个一点点,但我不知道这会工作:

function _validate(){ 
    Jobs._withCollection(function(err, collection){ 
     collection.count(query, function(count){ 
     yield count > 1 ? "Job already exist" : null; 
     }); 
    }) 
} 

Backbone.Model.extend({ 
    validate: function(){ 
    return _validate.call(this); 
    } 
}) 

尤其对于一些比较复杂的情况,例如我使用async,并且在async的最后一次回调中设置返回值(这显然是错误的,因为res在返回时为空):

Backbone.Model.extend({ 
    validate: function(){ 
    var res; 
    async.parallel([ 
     .. do stuff .. 
    ], function(err, results){ 
     res = results; 
    }) 
    return results; 
    } 
}) 

任何想法?

+1

对于这个以及其他许多原因,我不会使用Backbone和Node。有更好的对象模型和其他可用于Node的库,可以使用它们。 Backbone被构建为与浏览器一起工作,这与Node非常不同。 – 2012-03-20 11:47:37

回答

1

异步验证将需要某种方式的异步支持,对于节点而言意味着validate必须除了回调。你需要继承骨干类来支持这个,或者@Derick说不要担心服务器上的骨干。你会发现另一个不匹配的情况是骨干处理成功/失败的回调,有2个不同的函数,比如jquery,但是在node.js中,约定是一个回调,带有一个可选错误作为第一个位置参数。因此,如果您尝试在服务器上使用像Model.save()之类的东西,则必须在整个位置编写小型适配器函数,以便从jquery样式转换为节点样式异步错误处理。

我已经获得了在节点中工作的骨干类,但它需要这些类型的适配。