在使用Backbone.js进行验证时如何处理异步调用(具体是唯一性)

时间:2012-09-23 19:55:11

标签: validation node.js mongodb backbone.js

这与使用骨干网的客户端或服务器端应用程序相关。我试图创建一个验证函数,对MongoDB或一些REST调用进行唯一性检查(取决于环境)。这两个呼叫本质上都是异步的;但是,我认为我实际上需要在此处阻止它以进行验证。如果我没有返回任何内容,验证函数将假定验证通过。

我的代码目前在服务器端看起来像这样:

isUnique: function (key) {
    var dfdFindOne = this.findOne({key: this.get(key)}),
        dfd = new Deferred();
    dfdFindOne.done(function (err, result) {
        console.log(result);
        dfd.resolve(true);
    });
    return dfd;
};

......这里有些东西......
在我回来之前,我觉得我可以做一些等待,直到完成功能......也许不是。我希望骨干提供一个回调函数或某种东西或接受某种延迟类型的东西。

validate: function() {
    var result = undefined;
    if(!this.isUnique(key).done(function(){
       result = "AHHH not unique!";
    });
    return result;
}

一种可能的解决方案可能是强制mongodb的本机节点客户端同步调用事物。我想我可以用休息电话做同样的事情......但这可能是一个糟糕的解决方案。

1 个答案:

答案 0 :(得分:2)

您可以调用ajax请求并设置async:false,这样返回将具有值。但是要使用async:false是邪恶的,因为可能会在浏览器被锁定时出现。对于服务器端,可能并不总是设置async的解决方法:false

我的建议是使用您自己的验证流程而不是Backbone.validate流程,因为Backbone的验证流程只考虑同步验证。你可以尝试这样的事情:

//Code in your Model
isUnique: function (callback) {
    var dfdFindOne = this.findOne({key: this.get(key)});
    dfdFindOne.done(function (err, result) {
        console.log(result);
        callback(result);
    });
};
validate: function(callback) {
    this.isUnique(callback);
}

//trying to validate before save
model.validate(function(result){
  if( result == 'whatexpected'){
     model.save();
  }
});