Node.js 将异步代码与同步框架相结合

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){

我试图在服务器端(使用Nodejs)使用主干网来实现“一切”,但在进行正确的验证时遇到了困难

问题是主干网的验证方法返回一个布尔值,验证机制应该在其内部实现,但对于节点,这些机制是异步的,因此验证方法在评估代码之前返回

下面是一个代码示例,很好地说明了我的设置:

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