Почему это приложение узла с асинхронной функцией и веб-сокетом не закрывается? - PullRequest
0 голосов
/ 26 ноября 2018

Это приложение выполняет свою работу и затем не завершает работу, пока я не завершу работу вручную, например, Ctrl+C.Что приводит к тому, что приложение не закрывается?

let client = require('../client');

(async function basicFunctionCheck() {
    try {
        const connection = await qt.createConnection('ws://127.0.0.1', '8080', {
            timeout: 120000,
            logger: function() {
                prefix = "LOGGER: ";
                console.log.call(null, prefix, ...arguments)
            }
        });
        const application = client.createApplication(connection);
        const devices = await application.devices();
        if (devices.type === 'response' && devices.payload.devices.length) {
            const device = client.createDevice(connection, devices.payload.devices[0]);

            await device.calibrate();
            await device.setMain(true);
            await application.setAllMain(false);
        }
        connection.close();
        return;
    } catch (error) {
        console.dir(error);
    }
})();

EDIT

Кажется, что ожидание не работает, как я ожидал.Все они исполняются немедленно.По крайней мере, я получаю закрытие соединения немедленно.Тем не менее, обещания отклоняются через 2 минуты.

Вот еще код **

let WebSocket = require('ws');

function createConnection(host, port, userOptions) {
    const defaultOptions = { timeout: 60000 };
    const options = { ...defaultOptions, ... userOptions};
    const {
        logger,
        timeout
    } = options;

    let latestTransactionId = 0;
    let commandResolvers = new Map();
    const socket = new WebSocket(`${host}:${port}`);

    function newTransactionId() {
        latestTransactionId += 1;
        return latestTransactionId.toString();
    }

    function close() {
        if (logger) logger('Closing connection...');
        socket.terminate();
    }

    function request(body) {
        return new Promise(function(resolve, reject) {
            const transactionId = newTransactionId();
            commandResolvers.set(transactionId, resolve);

            const requestMessage = JSON.stringify({
                ...body,
                trans_id: transactionId
            });
            if (logger) logger(requestMessage);
            socket.send(requestMessage);

            setTimeout(function () {
                const timeoutMessage = 'Connection timed out...';
                if (logger) logger(timeoutMessage);
                reject(Error(timeoutMessage));
            }, timeout);    
        });
    }

    return new Promise(function(resolve, reject) {
        socket.onopen = function () {
            socket.onmessage = function(event) {
                const data = JSON.parse(event.data);
                if (logger) logger(data);
                const transactionId = data.trans_id;
                const commandResolver = commandResolvers.get(transactionId)
                commandResolver(data);
            };

            connection = {
                request,
                close 
            }

            resolve(connection);
        };

        setTimeout(function () {
            const timeoutMessage = 'Connection timed out...';
            if (logger) logger(timeoutMessage);
            reject(Error(timeoutMessage));
        }, timeout);
    });
}

function createApplication(connection) {
    function devices() {
        return connection.request({
            type: 'request',
            cmd: 'devices',
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...