【问题标题】:Combining async code with syncronous frameworks将异步代码与同步框架相结合
【发布时间】:2012-03-20 21:55:46
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

  • 出于这个和许多其他原因,我不会将 Backbone 与 Node 一起使用。有更好的对象模型和其他可用于 Node 的库,它们是为使用它而构建的。 Backbone 是为与浏览器一起工作而构建的,这是一个与 Node 非常不同的环境。

标签: node.js asynchronous backbone.js


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2020-02-08
    • 1970-01-01
    • 2018-12-06
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多