误导性的“不推荐使用没有回调的异步函数”警告

Posted

技术标签:

【中文标题】误导性的“不推荐使用没有回调的异步函数”警告【英文标题】:misleading “Calling an asynchronous function without callback is deprecated” warning 【发布时间】:2018-03-27 21:22:42 【问题描述】:

NodeJS 给了我一个警告

(node:32600) [DEP0013] DeprecationWarning: 调用异步 不推荐使用没有回调的函数。

当我运行这个“测试”时:

describe('whatever', () => 
  it('test simple', async () => 
    const dir = './build/fileTests';

    if (fs.existsSync(dir)) 
      console.log(`deleting $dir`);
      await fs.rmdir(dir);
    
  );
);

好吧,我几乎同意,在没有回调的情况下使用异步函数是不好的(因为只有在 cb 内你才能确定,它发生了,继续等等......

...如果不是我故意使用ES7 async/await,因为它们使它同步,所以我可以使用我得到的任何东西...(在这种特殊情况下,我可以回避@987654322 @,但这不是我的意思...)

所以我的问题:我怎样才能摆脱这样的警告?

– 在使用 async/await 时,以一种有意义的方式... – 处理返回值,如const r = ... 不被识别为‘回调处理’...

【问题讨论】:

async/await 不要使异步代码同步。它可能看起来像它,但事实并非如此。 这让我认为回调是异步谎言 【参考方案1】:

fs.rmdir 不返回 promise 对象,这就是为什么这段代码会因 swag 而失败。您必须使用库或 util 核心模块中的 node.js promisify 方法来承诺它

注意:如果您对 fs 核心模块中的其他 async 方法使用相同的方法,它将失败

这样做

const util = require("util");
const fs = require("fs");
const removeDir = util.promisify(fs.rmdir);

const rmDir = async () => 
   try 
      await removeDir("directory_name");
    catch(ex) 
      console.error(ex)
   

只要确保你承诺它

编辑:按照@bergi 的建议声明了一个变量来保存uti.promisify(fs.rmdir) 的值

编辑:使用try .. catch 块添加错误处理

【讨论】:

请注意,您应该将util.promisify 调用放在rmDir 函数之外,并存储结果。 已进行更改。谢谢@Bergi。

以上是关于误导性的“不推荐使用没有回调的异步函数”警告的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firefox 中控制范围输入旋钮的形状?

浏览器ssl警告啥意思

怎么忽略KEIL的警告

IOS警告消除

警告执行已完成,带有警告存储过程

Quick.db unwarn 命令取消警告成员中的所有警告