クライアントに応答を返す方法は間違いなくあります。Flashlight 検索統合にその良い例があります。
function doSearch(index, type, query) {
var ref = new Firebase(URL+'/search');
var key = ref.child('request').push({ index: index, type: type, query: query }).key();
console.log('search', key, { index: index, type: type, query: query });
ref.child('response/'+key).on('value', showResults);
}
このコードはクライアント側の JavaScript アプリケーションで実行され、 を呼び出す行でサーバーに検索語を送信しますpush()
。次に、関数の最後の行で応答が返されるのを「待機」します。ここで重要なのは、リクエストの送信に使用した sam push id/key を使用してレスポンスをリッスンすることです。そうすれば、リクエストとレスポンスが一致します。
Firebase Queue にはこのような「ハンドシェイク」のサポートが組み込まれていませんが、アプリのクライアント コードとサーバー コードに簡単に組み込むことができます。タスクを追加するときは、リクエスト ID ( firebase-queue サンプルのアダプター) を追加します。
var request_id = ref.push().key();
ref.child('queue/tasks').push({ requestId: request_id, foo: 'bar' });
タスク ワーカーで、通常の処理を実行してから、同じリクエスト ID ( firebase-queue サンプルのアダプター) でレスポンスをデータベースに書き戻します。
var ref = new Firebase('https://<your-firebase>.firebaseio.com/queue');
var responses = new Firebase('https://<your-firebase>.firebaseio.com/responses');
var queue = new Queue(ref, function(data, progress, resolve, reject) {
// Read and process task data
console.log(data);
// Do some work
progress(50);
// Finish the task asynchronously
setTimeout(function() {
// write the response to the client
responses.child(data.requestId).set({ allDone: true });
// tell firebase-queue that we're done
resolve();
}, 1000);
});