Вызов асинхронной функции javascript на сервере - PullRequest
0 голосов
/ 14 июля 2020

Кто-нибудь может посоветовать:

Я написал веб-страницу на стороне клиента, которая имеет соединение Websocket с приложением узла на стороне сервера. Все работает нормально.

Когда определенное сообщение отправляется через веб-сокет от клиента, я получаю ответ от сервера (снова через соединение через веб-сокет) с некоторым текстом, и я показываю его на стороне клиента, когда репозиторий получили. Все работает нормально.

А что, если я хочу сделать функцию на сервере асинхронной, которая ждет 4 секунды перед возвратом строки. Я не могу заставить это работать, строка возвращается как «[object Promise]».

Итак, исходный синхронный код на сервере, который выполняется в репозитории для вызывающего клиента и работает, :

Chatterer.prototype.HandleASCIIMessage = function(szMessage, ws)
{
    ws.send("BANG");
}

Теперь я заменил это на:

Chatterer.prototype.HandleASCIIMessage = function (szMessage, ws)
{
    var sz = this.Test();
    ws.send(sz);
}

Где Test:

Chatterer.prototype.Test = function()
{
    return this.ShowResult();
}

Остальная часть кода:

Chatterer.prototype.ShowResult = async function ()
{
    var result = await this.GetAsync();

    return result;
}

Chatterer.prototype.GetAsync = async function ()
{
    var result = await this.AsyncFunc();

    return result;
}

Chatterer.prototype.AsyncFunc = async function ()
{
    return new Promise(resolve => {
        setTimeout(() => {
            resolve("BANG");
        }, 4000);
    });
}

Я пытаюсь не вызывать строку ws.send (sz), пока не истекут 4 секунды.

Спасибо, Митч.

1 Ответ

1 голос
/ 14 июля 2020
Chatterer.prototype.ShowResult = async function ()
{
    var result = await this.GetAsync();

    return result;
}

Вышеупомянутая функция возвращает обещание (функция asyn c возвращает обещание). Это означает, что следующее также возвращает обещание:

Chatterer.prototype.Test = function()
{
    return this.ShowResult();
}

Вы также можете сделать приведенное выше async, чтобы сделать его более очевидным, но технически это не требуется.

Это означает, что здесь:

Chatterer.prototype.HandleASCIIMessage = function (szMessage, ws)
{
    var sz = this.Test();
    ws.send(sz);
}

sz - это обещание, поэтому либо сделайте HandleASCIIMessage async и var sz = await this.Test();, либо используйте vanilla Promise API с this.Test().then(sz => ws.send(sz)).

...