【问题标题】:Down-side on calling async function without await在没有等待的情况下调用异步函数的缺点
【发布时间】:2018-04-04 18:24:19
【问题描述】:

给定异步代码

async function wierdFunction(){
    setTimeout(function(){
        //background process that does not return
        //Russian roulette
        if ( Math.random() > 0.99 )
            throw new Error('Bang!');
    }, 3000);
}

我只需要异步调用这个函数,我不需要知道它什么时候结束。

app.post('/wierd-endpoint', function (req,res){
    wierdFunction();
    res.json({status:"Running. Now, go away."});
});

有什么建议不要在没有await关键字的情况下调用它?

【问题讨论】:

  • 我的意思是……你这样做有什么好处?你没有利用这样做给你的任何东西。为什么它首先是异步的?
  • 如果该函数需要对数据库进行多次修改,而用户无需等待。它的步骤、完成和错误都记录在数据库中,用户可以查看访问其他网页的过程。
  • 在这种情况下添加异步仍然不会改变任何东西。将创建并返回一个 Promise,然后在未使用后收集垃圾。 async 的函数不会使其更快或更慢,也不会对使用它的代码产生任何影响。这完全没有意义。
  • 这不是没有意义的。调用函数将运行完成,无需等待weirdFunction 调用。如果调用函数必须作为框架中与 UI 相关的 init 函数完成,这可能会产生或破坏响应性。也许您真的不在乎 何时 wierdFunction 完成,因为它会加载数据并更新 DOM 而没有其他依赖于它。您应该在任务中添加一个捕获,以避免未处理的拒绝。见Bob Kerns answer

标签: javascript node.js async-await


【解决方案1】:

只需从wierdFunction() 中删除async。如果你没有使用返回的承诺,也没有在内部使用await,那么就没有理由拥有它。它只是为返回创建了一个额外的promise 对象,然后该对象会被垃圾回收,因此它会产生额外的开销,并且它向调用者暗示调用者可以将该承诺用于一些有用的事情。

有什么建议不要在没有 await 关键字的情况下调用它吗?

如果你的操作是真正的“一劳永逸”,并且你不关心完成或报告错误,那么它不需要返回一个承诺,你可以让它成为一个启动异步操作的普通函数,但是不报告任何结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多