3

matcherキーアップイベントが送信されるたびに呼び出される 関数があります。

この関数は、次のようなモジュールに属しています(1)。
フェッチが完了する前に別の呼び出しが行われた場合はどうなりますか?
このモジュール(1)でこの問題を解決するにはどうすればよいですか?


(1)

(function ($, UserCollection) {

    var userCollection;

    var matcher = function (request, response) {
        if (!userCollection) {
            userCollection = new UserCollection();
            userCollection.fetch();
        } else {
            isMatched(request, response);
        }
    };

    return matcher;
}(jquery, UserCollection));
4

3 に答える 3

2

別の、おそらくやり過ぎのアプローチを取り、によって返されるjqXHRオブジェクトcollection.fetchを使用します。

var Matcher=(function($,UserCollection) {

    var xhr=null, userCollection=null;

    // matching against a defined ID for testing purpose
    function isMatched(id) {
        return userCollection.get(id);
    }

    // the request would be an ID in my example,
    // and the callback is the function invoked when the collection is fetched
    function matcher(request, callback) {
        if (!xhr) {
            userCollection = new UserCollection();

            // fetch returns a handy xhr object used for the deferred
            xhr=userCollection.fetch(); 
        }

        xhr.then(function() {
            callback(isMatched(request));
        });
    }       

    return matcher;

})(jQuery, UserCollection);

xhrがすでに解決されている場合、コールバックはすぐに呼び出されます。解決されていない場合は、リクエストが完了したときに呼び出されます。詳細については、 jQuery.Deferredを参照してください。

そして、あなたはそれを次のように使用します

Matcher(1,console.log);
Matcher(2,console.log);

そしてフィドルhttp://jsfiddle.net/EWSAV/1/

于 2012-07-11T14:35:53.333 に答える
1

イベントはタイムリーに実行されるため、同期アクションを実行する限り、これは問題になりません。

ただし、マッチングが進行中であるかどうかを示す2番目の変数を追加することもできます。

このようなもの:

(function ($, UserCollection) {

    var userCollection;
    var inProgress = false;

    var matcher = function (request, response) {
        if (!inProgress){
           if (!userCollection) {
               inProgress = true;
               userCollection = new UserCollection();
               userCollection.fetch();
           } else {
               isMatched(request, response);
           }
           // inProgress = false; - after your asynchonous code is executed
        }
    };

    return matcher;
}(jquery, UserCollection));

このコードはおそらく機能しませんが、あなたはその考えを理解したと思います。

ただし、このアプローチでは、にアクセスするために非同期スクリプトが同じスコープ内にある必要がある場合がありますinProgress。より良いオプションは、フェッチでコールバックを操作することです。

userCollection.fetch({ success:function(){inProgress=false} });
于 2012-07-11T14:05:53.473 に答える
0

Backbone.jsのドキュメントによるとfetch()、「フェッチ」が成功した後に呼び出されるコールバック関数を受け入れます。したがって、現在の「フェッチ」の状態を示すグローバル変数を持つことができます。これが基本的な考え方です。ここから自分のやり方で作業できると思います

fetching = false;
//Event fired ->
if (!fetching ){
fetching = true;
..fetch({success: function(){fetching = false;}});
}
于 2012-07-11T14:09:53.360 に答える