3

这与使用主干的客户端或服务器端应用程序相关。我正在尝试创建一个验证函数,对 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 的本机节点客户端同步调用事物。我想我可以对休息电话做同样的事情......但这可能是一个糟糕的解决方案。

4

1 回答 1

2

您可以调用 ajax 请求并设置 async:false 以这种方式返回将具有值。但是使用 async:false 是邪恶的,因为可能会在浏览器被锁定时出现。对于服务器端,set 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();
  }
});
于 2012-09-26T14:41:15.510 回答