Получить ответ от zeromq в nodejs - PullRequest
0 голосов
/ 07 апреля 2020

Я не понимаю, как я могу написать функцию, которая возвращает ответ zeromq в nodejs: до сих пор я писал это;

module.exports = {

    getInfo: function(id) {

        var requester = zmq.socket('req');
        var config = 'NACK';

        requester.connect("ipc:///tmp/endpoint");

        console.log("Sending request...");
        requester.send(["GET_INFO","1234"]);

        requester.on("message", function(reply) {
            //console.log("Received reply", ": [", reply.toString(), ']');

            requester.close();
            return reply.toString();
          });
    },

}

Если я включаю журнал внутри обратного вызова "on" все правильно, я получаю информацию, которую я запрашиваю. Но если я вызову эту функцию из другого скрипта, возвращаемое значение будет «неопределено». Как я могу «извлечь» эти данные и вернуть их при вызове функции getInfo извне? Спасибо

1 Ответ

1 голос
/ 07 апреля 2020

Ваш return не связан с вашей функцией getInfo, он связан с функцией анонимного обратного вызова, которую вы определяете function(reply) {....

Вы можете преобразовать свою функцию для возврата обещания, но это потребует, чтобы вы ожидали его (или использовали then с обратным вызовом на вызывающей стороне):

module.exports = {

    getInfo: function(id) {
        return new Promise(resolve => {
            var requester = zmq.socket('req');
            var config = 'NACK';

            requester.connect("ipc:///tmp/endpoint");

            console.log("Sending request...");
            requester.send(["GET_INFO","1234"]);

            requester.on("message", function(reply) {
                //console.log("Received reply", ": [", reply.toString(), ']');

                requester.close();
                resolve(reply.toString());
            });
        });
    },

}

Чтобы узнать об обещаниях и асинхронности / ожидания, см., например, https://javascript.info/async-await

Чтобы вызвать функцию с помощью await, можно, например, выглядеть так:

var result = await getInfo(id); // Assuming the function is imported/required before
...