首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES8立即调用异步函数表达式

ES8立即调用异步函数表达式
EN

Stack Overflow用户
提问于 2016-11-22 23:00:06
回答 2查看 30.5K关注 0票数 41

我没有见过这些构造的使用很多,但我发现自己编写它们是为了在通常不会返回promise的函数中使用async / await

代码语言:javascript
复制
chan.consume(queue, (msg) => {
  this.pendingMsgs++; // executed immediately
  (async () => {
    await this.handleMessage(msg);
    this.pendingMsgs--;
    if (cancelled && this.pendingMsgs === 0) {
       await chan.close();
       await this.amqpConnectionPool.release(conn);
    } 
  })();
});

而不是

代码语言:javascript
复制
chan.consume(queue, async (msg) => { // external lib does not expect a return value from this callback
  this.pendingMsgs++;  // executed in promise context(?)
  await this.handleMessage(msg);
  this.pendingMsgs--;
    if (cancelled && this.pendingMsgs === 0) {
       await chan.close();
       await this.amqpConnectionPool.release(conn);
    }
});

代码语言:javascript
复制
chan.consume(queue, (msg) => {
  this.pendingMsgs++;  // no await - excess function decls & nesting
  this.handleMessage(msg).then(() => {
    this.pendingMsgs--;
    if (cancelled && this.pendingMsgs === 0) {
       chan.close().then(() => {
         this.amqpConnectionPool.release(conn);
       });
    }
  });
});

这是“一件事”吗?这里有没有我应该注意的陷阱?在这种情况下使用async / await会有什么后果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-23 00:11:00

这是“一件事”吗?

是。它时不时地出现,例如here。它们被称为IIAFE :-)

如果你想把焦点放在箭头上,你也可以叫它们IIAAFs。

这里有没有我应该注意的陷阱?

当你调用一个promise返回函数并且没有将结果返回到其他地方时,你自己要对promise负责--这意味着你必须处理其中的错误。因此,该模式通常应如下所示

代码语言:javascript
复制
(async () => {
    …
})().catch(err => {
    console.error(err);
});

如果您不想关注未处理的拒绝事件。

在这种情况下使用async/await的本质是什么?

then版本相比,并不是很多。然而,您说“外部lib不期望从这个回调返回一个值”,这可能暗示了库与异步回调的不兼容,所以当您在做什么的时候要小心。它还可能依赖于从回调中同步抛出的异常,所以这完全取决于库在这里期望什么(如果没有期望,将来是否会改变)。您不希望将来出现不兼容的情况,以防库开始特别处理promise返回值。

但是,我仍然推荐第二种模式,它直接将async函数作为回调直接传递,因为它具有更好的可读性。如果您希望避免向库返回promise,请创建包装回调的helper函数:

代码语言:javascript
复制
function toVoid(fn) {
    return (...args) => void fn(...args);
}
function promiseToVoid(fn) {
    return (...args) => void fn(...args).catch(console.error);
}

您可以像这样使用它:

代码语言:javascript
复制
chan.consume(queue, toVoid(async (msg) => {
     … // use `await` freely
}));
票数 59
EN

Stack Overflow用户

发布于 2021-03-30 21:37:11

代码语言:javascript
复制
(async () => {
        await func();
    })();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40745153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档