あなたが言うように、応答オブジェクトを渡すことはできません。ただし、ワーカーが作業を完了したときにメイン スレッドが正しい応答オブジェクトを取得できるようにする、ある種の識別子を渡すことができます。
たとえば、次のことができます
- メインスレッドでは、各応答オブジェクトを一意の整数 ID で保存します
- この ID をワーカーに渡します
- ワーカーが完了したら、この ID をその作業の結果とともにメイン スレッドに戻します。
- メイン スレッドは正しい応答オブジェクトを取得し、結果をクライアント (つまり、Web ブラウザー) に返します。
以下は基本的な実装です
var http = require('http');
var Worker = require('webworker-threads').Worker;
// Store in-progress responses by unique(-enough) ID
// that is passed to the worker that then passes it back
var responses = {
_nextResponseId: 0,
_responses: {},
store: function store(response) {
var id = this._nextResponseId;
this._nextResponseId = this._nextResponseId === Number.MAX_SAFE_INTEGER ? 0 : (this._nextResponseId + 1);
this._responses[id] = response;
return id;
},
remove: function remove(id) {
var response = this._responses[id];
delete this._responses[id];
return response;
}
};
// Worker,simulating something long and synchronous
var worker = new Worker(function() {
onmessage = function(event) {
var id = event.data.id;
for (var i = 0; i < 1000000000; ++i) {}
self.postMessage({
id: id,
message: 'From worker, request ' + id
});
};
});
// A worker message ends the original http response
worker.onmessage = function(event) {
var response = responses.remove(event.data.id);
response.end(event.data.message);
};
// Simple server that calls the worker with the id of the response
var server = http.createServer(function handleRequest(request, response) {
var id = responses.store(response);
worker.postMessage({
id: id
});
});
server.listen(8083);