3

これは、バックボーンを使用するクライアント側またはサーバー側のアプリのいずれかに関連します。MongoDBまたはREST呼び出し(環境に応じて)に対する一意性チェックを備えた検証関数を作成しようとしています。これらの呼び出しは両方とも本質的に非同期です。ただし、検証のために、実際にはここでブロックする必要があると思います。何も返さない場合、validate関数は検証に合格したと見なします。

私のコードは現在、サーバー側では次のようになっています。

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の検証フローは同期検証のみを考慮して作成されているため、Backbone.validateフローの代わりに独自の検証フローを使用することをお勧めします。あなたはこのようなことを試すことができます:

//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 に答える