5月中旬、開発者はfirebase-queueのリリースを発表しました。 これは、タスクと同様に、データベース内のデータを使用して作業を整理できるjavascriptライブラリです。 次のように機能します。接続を確立するサーバーでQueue()を使用してタスクセルを定義します。 現在、このセルに新しい要素が表示されると、サーバーは必要なアクションを実行し、必要に応じて進行状況とエラーを通知し、完了時にタスクを削除します。 その結果、Firebaseの開発で発生する多くの問題をカバーする機会が得られます-データの調整、追加の検証(スパムやメイトの確認など)の実施、別の場所への送信(ホスティングへの写真のアップロードなど)など。
例として、stackoverflowから上記の質問を取り上げます。 n番目の要素数を持つオブジェクトがあります。 アイテムを追加/削除した後、合計数を更新します。 データベースでは、 要素と長さの 2つのオブジェクトを定義します。 また、ルールで、 addnodeおよびrmnode タスクセルを指定します。 その中で、受信したいオブジェクトをクライアントから送信し、それに応じてelementsから削除します 。
var ref = new Firebase('https://***.firebaseio.com'); var addNode = function(text) { // kriskowal/q var deferred = Q.defer(); var task = ref.child('addnode').push({ new: text }, function(e) { if (e) { deferred.reject(e); } else { /* . progress() _progress, resolve() - . */ ref.child('addnode/'+task.key()).on('value', function(d) { var v = d.val(); if(v == null) { deferred.resolve(); } else { deferred.notify(v._progress); } }) }}); return deferred.promise; } var rmNode = function(k) { var deferred = Q.defer(); var task = ref.child('rmnode').push({ key: k }, function(e) { if (e) { deferred.reject(e); } else { ref.child('addnode/'+task.key()).on('value', function(d) { var v = d.val(); if(v == null) { deferred.resolve(); } else { deferred.notify(v._progress); } }) }}); return deferred.promise; }
Firebase-queueをタスクセルにアタッチします。 新しいタスクが表示されるとすぐに、サーバー上で必要な操作を既に実行します。
var ref = new Firebase('https://***.firebaseio.com'); var length; ref.child('length').once('value', function(d) { length = d.val(); }); var addNodeQueue = new Queue(ref.child('addnode'), {}, function(data, progress, resolve, reject) { ref.child('elements').push(data.new, function(e) { if (e) { reject(e); } else { progress(50); length++; ref.child('length').set(length, function(e) { if (e) { reject(e.message); } else { resolve(); }}); }}); }); var rmNodeQueue = new Queue(ref.child('rmnode'), {}, function(data, progress, resolve, reject) { ref.child('elements/'+data.key).remove(function(e) { if (e) { reject(e); } else { progress(50); length--; ref.child('length').set(length, function(e) { if (e) { reject(e); } else { resolve(); }}); }}); });
ルールは次のとおりです。
{ "rules": { "addnode": { "$taskId": { "new": { ".validate": "newData.isString()" } } }, "rmnode": { "$taskId": { "key": { ".validate": "root.child('elements/'+newData.val()).exists()" // } } } } }
記事の概要を過負荷にせず、保存しないために、 Queue()に指定できるタスク、タスク仕様、およびオプションのセキュリティルールに関する話を省略することにしました。 これは問題ありません(ドキュメントも同様)は、githubのプロジェクトページで説明されています。