匿名函数的等待/异步

Posted

技术标签:

【中文标题】匿名函数的等待/异步【英文标题】:Await / async on anonymous function 【发布时间】:2019-01-10 12:36:48 【问题描述】:

我正在尝试在匿名函数上使用 await,结果如下:

这是行之有效的方式

async function hello()
    return "hello";

let x = await hello();
console.log(x);

结果:

“你好”

这是我希望它工作的方式:

let x = await async function() return "hello";
console.log(x);

结果:

[异步函数]

我错过了什么?我对 Promise 不熟悉。

编辑: 我尝试在匿名函数之后添加 () 来调用它。这是带有实际异步代码的示例:

let invitationFound = await (async function (invitationToken, email)
    return models.usersModel.findOneInvitationByToken(invitationToken, email)
        .then(invitationFound => 

            return  invitationFound;
        )
        .catch(err =>
           console.log(err);
        );
)();

console.log(invitationFound);
return res.status(200).json("oki " : invitationFound);

console.log 的结果:

服务器响应 域:空, _events:完成:[功能:绑定resOnFinish], _eventsCount:1, _maxListeners:未定义, 输出: [], 输出编码:[], .....

res.code 的结果..

handledPromiseRejectionWarning: TypeError: Converting circular structure to JSON

我不认为错误来自models.usersModel.findOneInvitationByToken,因为当我在第一种情况下使用它时它工作正常

let userFound = await test(invitationToken, email);

编辑 2:

我发现了第二个问题!我忘了把参数放在括号里

let invitationFound = await (async function (invitationToken, email)
    return models.usersModel.findOneInvitationByToken(invitationToken, email)
        .then(invitationFound => 

            return  invitationFound;
        )
        .catch(err =>
           console.log(err);
        );
)(invitationToken, email);

console.log(invitationFound);
return res.status(200).json("oki " : invitationFound);

结果:

oki : mydata

【问题讨论】:

为什么要在同步函数上使用 async/await? 在第二个 sn-p 中,你只是声明了函数,但没有调用它。 @alfasin 如何在同一行调用它? 如果您需要交互式调试帮助,我建议单独提出一个问题来解决这些不相关的问题或开始聊天会话。希望您关于等待匿名函数的问题得到解答。 我认为有更简单的方法可以做到这一点,但也许我们只需要链接到聊天室?! chat.***.com/rooms/17/javascript 【参考方案1】:

你在等待 Promises,它们是从异步函数中返回的,而不是异步函数本身。只需添加一个调用:

let x = await (async function() return "hello")();
console.log(x);
// or
console.log(await (async() => 'hello')())

【讨论】:

我试过了,我的 console.log 现在返回一个 serverResponse 对象。我将编辑我的帖子 @Couteau 这就是为什么您将实际的 asynchronous 代码放在问题中的原因,而不仅仅是从异步函数返回字符串(首先不应该这样做) 如果您使用的是fetch,则需要获得serverResponse。如果您想下载响应的内容,则需要调用其.json() 或类似方法并等待。 在 Node.js 上使用它会导致:ReferenceError: await is not defined @Sososlik 可能适用于 Node.js 的真正旧版本。自7.6 起支持await。您可能还会在 REPL 中看到这一点,因为您的版本可能不支持***等待。【参考方案2】:

第二种情况你没有调用函数:

let x = await hello();

这是您在第一种情况下访问它的方式,但在第二种情况下,您只是将 await 添加到函数声明中。只是返回函数,需要改成

let x = await (async function() return "hello")();
console.log(x);

【讨论】:

我试过了,我的 console.log 现在返回一个 serverResponse 对象。我将编辑我的帖子

以上是关于匿名函数的等待/异步的主要内容,如果未能解决你的问题,请参考以下文章

Node.js匿名函数-闭包-Promise

JS中匿名函数$(function(){ })和(function(){})()的区别

使用 async/ await 进行 异步 编程

javascript要点1

`this.some_property` 在匿名回调函数中变得未定义

javascript要点(上)