繁体   English   中英

Node.js异步功能

[英]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实际上是如何工作的。 然后,我使用全局messageArraymessageId计数器解决了我的问题。 每个用户请求都保存在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM