[英]Node.js async functions
下面的代码应通过向某个远程服务器(kafka代理)产生请求消息来处理http请求,并等待使用它的响应。 当响应消息到达时-应该作为http响应(json或其他形式)返回。
router.get('/status', function(req, res, next) {
// init the producer
...
// 1st async function
producer.on('ready', function () {
// some code for generating payloads (data for a message)
...
// 2nd async function
producer.send(payloads, function (err, data) {
// some log of success sending message
...
// 3rd async function
consumer.on('message', function (message) {
// got some response message
res.send("message: " + message);
});
});
});
});
即使不是我,也可以将这些同步在一起吗?
编辑:我会尝试更清楚。 考虑以下代码:
function boo() {
// part 1 - init some consumer
console.log("1. finish init");
// part 2 - This is async function. whenever messages will arrive - this function will be fetched.
consumer.on('message', function (message) {
console.log("2. message arrive!");
return message;
}
// part 3
console.log("3. end function");
return null;
}
假设第2部分在1秒后发生。 输出将是:
1. finish init
3. end function
2. message arrive!
而我的目标是等待异步消息(第2部分)并返回其值。 我该如何实现?
您可以使用async
库。
async.series([
fn1,
fn2
], function (err, results) {
console.log(results);
});
或者您可以使用https://github.com/AndyShin/sequenty
var sequenty = require('sequenty');
function f1(cb) // cb: callback by sequenty
{
console.log("I'm f1");
cb(); // please call this after finshed
}
function f2(cb)
{
console.log("I'm f2");
cb();
}
sequenty.run([f1, f2]);
当问这个问题时,我是node.js的新手。 观看了Philip Roberts的视频后,我意识到了JavaScript实际上是如何工作的。 然后,我使用全局messageArray
和messageId
计数器解决了我的问题。 每个用户请求都保存在messageArray
(带有其相关的处理程序对象,以供以后响应)。 然后,消息通过kafka发送到内部系统组件中。 在消息从系统返回之前,用户不会得到响应。 当消息到达kafka消费者(从系统组件)时-我们提取相关ID,然后回复相关用户)。 这是代码:
var messageId = 0;
var messageArray= [];
router.get('/status', function(req, res, next) {
var o = {id: messageId, req: req, res: res, next: next};
messageArray.push(o);
messageId++;
// send message with kafka producer into the system internal components - THE MESSAGE CONTAINS THE messageId!
});
consumer.on('message', function (message) {
// Extract the original messageId from the arrived message and look for it in the messageArray
var messageId = extractMessageId(message);
var data = dequeueMessageById(messageId);
// got some response message
data.res.send("message: " + message);
});
function dequeueMessageById(messageId) {
for (var i=0 ; i < messageArray.length ; i++) {
if (messageArray[i].id == messageId) {
var messageData = messageArray[i];
messageArray.splice(index, 1); // remove from array
return messageData;
}
} /* for */
return null;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.