2017-10-16 64 views
3

的NodeJS给我一个警告误导“调用回调没有异步函数已被弃用”警告

(节点: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,因为它们使它同步,所以我可以用我得到的任何东西...(在这个特殊情况下,我可以回避到rmdirSync,但这不是我的观点......)

so my Question:我怎样才能摆脱像这样的警告?

- 以一种有意义的方式,异步/的await ... 工作时 - 处理返回值,如const r = ...不被认为是“回调处理” ...

+0

'异步/ await'不作异步代码同步。它可能会喜欢它,但事实并非如此。 – robertklep

+2

这让我想起回调作为异步谎言 –

回答

5

fs.rmdir做不返回承诺对象,这就是为什么此代码与赃物失败。你必须promisify它,使用库或Node.js的promisify方法util核心模块

注:如果您使用的fs核心模块中的其他异步方法同样的方法,它会失败

做到这一点

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) 
    } 
} 

只要确保你promisify它

编辑:声明一个变量来保存的uti.promisify(fs.rmdir)值由@bergi

编辑的建议:添加错误与try .. catch块处理

+2

请注意,您应该将'util.promisify'调用放在'rmDir'函数之外,并存储结果。 – Bergi

+2

已作出更改。谢谢@Bergi。 –