Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js异步函数_Javascript_Node.js_Asynchronous_Apache Kafka - Fatal编程技术网

Javascript Node.js异步函数

Javascript Node.js异步函数,javascript,node.js,asynchronous,apache-kafka,Javascript,Node.js,Asynchronous,Apache Kafka,下面的代码应该通过向某个远程服务器(kafka broker)生成一条请求消息并等待使用该请求的响应来处理http请求。当响应消息到达时,它应该作为http响应(json或其他)返回 我能把这些同步到一起吗?即使不是我的 编辑: 我会尽量弄清楚的。考虑下面的代码: function boo() { // part 1 - init some consumer console.log("1. finish init"); // part 2 - This is async

下面的代码应该通过向某个远程服务器(kafka broker)生成一条请求消息并等待使用该请求的响应来处理http请求。当响应消息到达时,它应该作为http响应(json或其他)返回

我能把这些同步到一起吗?即使不是我的

编辑: 我会尽量弄清楚的。考虑下面的代码:

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);
});
或者你可以用


您可以使用
async

async.series([
 fn1,
 fn2
 ], function (err, results) {    
 console.log(results);
});
或者你可以用


问这个问题时,我对node.js完全陌生。看了之后,我意识到JavaScript实际上是如何工作的。然后,我用一个全局
messageArray
&一个
messageId
计数器解决了我的问题。每个用户请求都保存在
messageArray
中(带有相关的handlers对象,供以后响应)。然后,信息通过卡夫卡发送到内部系统组件。直到消息从系统返回,用户才会得到响应)。当消息到达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;
}
var messageId=0;
var messageArray=[];
路由器.get('/status',函数(req,res,next){
var o={id:messageId,req:req,res:res,next:next};
messageArray.push(o);
messageId++;
//将带有kafka producer的消息发送到系统内部组件-该消息包含消息ID!
});
consumer.on('message',函数(message){
//从到达的消息中提取原始messageId,并在messageArray中查找它
var messageId=extractMessageId(消息);
var data=dequeueMessageById(messageId);
//收到一些回复信息
data.res.send(“消息:”+消息);
});
函数dequeueMessageById(messageId){
对于(var i=0;i
问这个问题时,我对node.js完全陌生。看了之后,我意识到JavaScript实际上是如何工作的。然后,我用一个全局
messageArray
&一个
messageId
计数器解决了我的问题。每个用户请求都保存在
messageArray
中(带有相关的handlers对象,供以后响应)。然后,信息通过卡夫卡发送到内部系统组件。直到消息从系统返回,用户才会得到响应)。当消息到达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;
}
var messageId=0;
var messageArray=[];
路由器.get('/status',函数(req,res,next){
var o={id:messageId,req:req,res:res,next:next};
messageArray.push(o);
messageId++;
//将带有kafka producer的消息发送到系统内部组件-该消息包含消息ID!
});
consumer.on('message',函数(message){
//从到达的消息中提取原始messageId,并在messageArray中查找它
var messageId=extractMessageId(消息);
var data=dequeueMessageById(messageId);
//收到一些回复信息
data.res.send(“消息:”+消息);
});
函数dequeueMessageById(messageId){
对于(var i=0;i
我没有发现问题。问题是什么?(顺便说一下,这不是一个完整的代码示例,读起来像是一个是/否的问题。我也不确定“同步在一起”是什么意思。你基本上是在问一个流行的“如何使异步代码按顺序运行”问题,你可以在网上找到很多答案。@Cristy我在node.js中找到了与客户端相关的问题(例如在jQuery中使用async:false的解决方案),但在node.js中没有找到。你能告诉我吗?我不明白这个问题。问题是什么?(顺便说一下,这不是一个完整的代码示例,读起来像是一个是/否的问题。我也不确定“同步在一起”是什么意思。你基本上是在问一个流行的“如何使异步代码按顺序运行”问题,你可以在网上找到很多答案。@Cristy我在node.js中找到了与客户端相关的问题(例如在jQuery中使用async:false的解决方案),但在node.js中没有找到。你能参考一下吗?它不应该是async.瀑布而不是series吗?@ItayB:这取决于你希望结果如何,async.瀑布允许每个函数将其结果传递给下一个函数,而async.series将全部结果传递给最终回调。我认为它不适合我的情况。第二个异步函数不是我的(第三方-卡夫卡节点)-我不是调用它的人..抱歉,我花了太长时间才响应。我对你的答案投了赞成票,因为它对我帮助很大——但我用另一种方式解决了它。我会尽快在这里更新它。谢谢它不应该是async.瀑布而不是series吗?@ItayB:这取决于您希望结果如何,async.瀑布允许每个函数将其结果传递给下一个函数,而async.series将全部结果传递给最终回调。我认为它不适合我的情况。第二个异步函数不是我的(第三方-卡夫卡节点)-我不是调用它的人..抱歉,我花了太长时间才响应。我对你的答案投了赞成票,因为它对我帮助很大——但我用另一种方式解决了它。我会