提问者:小点点

在服务器上调用异步javascript函数


谁能建议一下:

我已经写了一个客户端网页,其中有一个Websocket连接到服务器端节点应用程序。 一切正常。

当某个消息通过websocket从客户端发送时,我让服务器响应(同样通过websocket连接)一些文本,当接收到reposnse时,我在客户端显示这些文本。 一切正常。

现在,如果我想使服务器上的函数为异步函数,它在返回字符串之前等待4秒,该怎么办。 我无法使其工作,字符串返回为“[object Promise]”。

因此,服务器上的原始同步代码(在reposnse中执行到客户端调用并且正在工作)是:

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

现在我将其替换为:

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

其中测试为:

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);
    });
}

我试图在4秒后才调用ws.send(sz)行。

谢谢,米奇。


共1个答案

匿名用户

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

    return result;
}

上面的函数返回一个promise(异步函数返回一个promise)。 这意味着下面的代码也返回一个承诺:

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

您也可以使用上面的async来使其更加明显,但在技术上并不需要这样做。

这意味着在这里:

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

sz是一个承诺,因此要么使handleasciimessageasyncvar sz=await this.test();,要么使用普通的promiseAPI和this.test()。then(sz=>ws.send(sz))

相关问题