Node.js 将异步代码与同步框架相结合
我试图在服务器端(使用Nodejs)使用主干网来实现“一切”,但在进行正确的验证时遇到了困难 问题是主干网的验证方法返回一个布尔值,验证机制应该在其内部实现,但对于节点,这些机制是异步的,因此验证方法在评估代码之前返回 下面是一个代码示例,很好地说明了我的设置:Node.js 将异步代码与同步框架相结合,node.js,asynchronous,backbone.js,Node.js,Asynchronous,Backbone.js,我试图在服务器端(使用Nodejs)使用主干网来实现“一切”,但在进行正确的验证时遇到了困难 问题是主干网的验证方法返回一个布尔值,验证机制应该在其内部实现,但对于节点,这些机制是异步的,因此验证方法在评估代码之前返回 下面是一个代码示例,很好地说明了我的设置: Backbone.Model.extend({ validate: function(){ var result; Jobs._withCollection(function(err, collection){
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在返回时为null):
有什么想法吗?异步验证需要某种方式的异步支持,这对于节点来说意味着除了回调之外,
validate
。您需要对主干类进行子类化以支持这一点,或者正如@Derick所说的,不要在服务器上使用主干。您将发现的另一个不匹配之处是,主干使用两个不同的函数处理成功/失败回调,就像jquery一样,但在node.js中,约定是一个回调,其中一个可选错误作为第一个位置参数。因此,如果您试图在服务器上使用Model.save()
之类的东西,您将不得不到处编写小型适配器函数,以便将jquery样式转换为节点样式的异步错误处理
我已经让主干类在node中工作,但它需要这些类型的自适应。出于这个原因和许多其他原因,我不会在node中使用主干类。有更好的对象模型和其他可用于Node的库,它们是为使用Node而构建的。主干网是为使用浏览器而构建的,浏览器与节点环境截然不同。
Backbone.Model.extend({
validate: function(){
var res;
async.parallel([
.. do stuff ..
], function(err, results){
res = results;
})
return results;
}
})