我正在寻找一种设计模式,而不是将原始请求和响应对象的答案流匹配。
假设我收到了所有狗图片的网络请求。我想将该请求提交给消息队列,以便工作进程最终可以处理它。当工作机器抓取狗图片请求时,它执行工作并将响应提交给由Express监视的应答队列。当我处理传入队列时,我想将狗图片响应与原始请求和响应对象进行匹配,这样我就可以返回狗列表或进一步处理它。
我遇到了两种解决方案,但每种解决方案都显得不够优雅。我可以保留对原始上下文的全局引用,找到它,然后从全局列表中删除它。
或者我可以创建对响应队列的订阅,并在所有答案中查找我的答案。这可行,但是效率低,而且其复杂性几何上升。 (10x10,100x100,1000x1000)
答案 0 :(得分:1)
var express = require('express');
var app = express();
app.get('/doglist.txt', function(req, res){
putReqIntoQueue(req,res,"dogs");
});
var theRequests ={};
var i = 0;
var giveUpSecs = 60;
var putReqIntoQueue = function(req,res,payload) {
var index = 'index_'+i;
i++
var obj = {req:req,res:res,payload:payload,index:index}
theReqests[index] = obj;
var timeoutId = setTimeout(function(theIndex) {
theRequest[theIndex].res.send('timeout error');
delete theRequest[theIndex];
}(index),giveUpSecs*1000);
// insertIntoQueue(index,payload,timeoutId)
}
var onNewQueueResponse = function(index,payload,answer,timeoutId) {
clearTimeout(timeoutId);
if (index in theRequests) {
var obj = theRequests[index];
obj.res.send(payload);
delete theRequests[index];
} else {
// must have already timed out
}
}
// Queue("onNewMessage",onNewQueueResponse)
app.listen(3000);
console.log('Listening on port 3000');
这个答案假定某种接受工作的队列(insertIntoQueue)然后在通过“onNewMessage”事件完成时返回数据。它会在60秒后超时。