等待/异步匿名功能

时间:2018-08-02 16:52:00

标签: javascript node.js asynchronous async-await es6-promise

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

这是工作方式

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

结果:

  
    

“你好”

  

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

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

结果:

  
    

[AsyncFunction]

  

我想念什么?我是新来的诺言。

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

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的结果:

  
    

ServerResponse {       域:null,       _events:{完成:[功能:绑定resOnFinish]},       _eventsCount:1       _maxListeners:未定义,       输出:[],       outputEncodings:[],     .....

  

res.code的结果。

  
    

handledPromiseRejectionWarning:TypeError:将圆形结构转换为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}}

  

3 个答案:

答案 0 :(得分:4)

您正在等待 Promise ,它们是从异步函数而不是异步函数本身返回的。只需添加一个电话即可:

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

答案 1 :(得分:1)

在第二种情况下,您不调用函数:

let x = await hello();

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

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

答案 2 :(得分:1)

您可以像这样使用Promise并等待:

async abc function() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('hello');
    }, 2000);
  });
}
let x = await abc();
console.log(x);
// OR
let y = await (async function() {return "hello"})();
console.log(y);
// OR
console.log(await (async() => 'hello')())