2017-10-16 120 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。 –

相關問題