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

时间:2012-03-20 11:15:33

标签: node.js asynchronous backbone.js

我正在尝试在服务器端(使用Nodejs)将“骨干”用于“一切”,并且无法进行适当的验证。

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

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

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的最后一个回调中设置的,就像这里一样(这显然是错误的,因为res在返回时为null):

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

我已经在节点中使用Backbone类,但它需要这些类型的适应。