匿名函数的等待/异步
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 对象。我将编辑我的帖子以上是关于匿名函数的等待/异步的主要内容,如果未能解决你的问题,请参考以下文章
JS中匿名函数$(function(){ })和(function(){})()的区别