【问题标题】:How can I handle async calls when validating with Backbone.js (uniqueness specifically)使用 Backbone.js 验证时如何处理异步调用(特别是唯一性)
【发布时间】:2012-09-23 19:55:10
【问题描述】:

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

【问题讨论】:

    标签: validation node.js mongodb backbone.js


    【解决方案1】:

    您可以调用 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();
      }
    });
    

    【讨论】:

    • 这是一个很好的解决方案;但是,我相信它提到的文档在使用“set”时也会调用 validate,这意味着我要么需要覆盖 set,要么使用替代方法和调用 set,这可能会导致一些混乱。对此有什么想法吗?
    • 我知道 validate 将在集合中被调用,但是因为我们的新 validate 没有为 Backbone 返回任何内容,这意味着 validate(在他们的流程中)是可以的。我的解决方法与 Backbone 没有冲突。选中“如果属性有效,则不从 validate 中返回任何内容;如果它们无效,则返回您选择的错误。”
    • 如果您觉得舒服,您可以使用其他名称调用新的验证,例如 customValidate,然后调用 model.customValidate(function(result){ 但重要的是,对于异步行为,我们不需要发明轮子,常见的解决方案是回调。=)
    • 我想我想不出除了需要异步的唯一性之外的许多其他情况。所有这些都会在片场被跳过。我想在客户端保存时我可以强制 async 为假,这只会让服务器端成为一个问题。我想设置在那里并不重要,因为大多数时候我们会立即设置然后保存,这意味着我可以随意保存保存,但我希望......足够公平:)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    相关资源
    最近更新 更多