2017-09-26 144 views
0

所以在Node中我們使用異步函數。爲此,我們使用回調函數作爲參數。但是,如何在執行最後的函數後終止代碼呢?只需傳遞空函數?這裏的例子:回調函數節點的回調js

fs.mkdir('stuff', function(){ 
    fs.readFile('readMe.txt', 'utf8', function(err, data) { 
     fs.writeFile('./stuff/writeMe.txt', data); 
    }); 
}); 

的mkdir有回調函數 - 無一不精

READFILE有回調函數 - 無一不精

WriteFile的已經不是回調函數,因爲這就是我想要做的最後一件事,後來我在控制檯中出現錯誤: 「DeprecationWarning:不建議調用不帶回調的異步函數。」

我應該每次都這樣做,傳遞一個空函數作爲回調來避免錯誤?最佳做法是什麼?

+0

你的回調不處理任何錯誤條件.... –

回答

2

我應該每次都這樣做,傳遞一個空函數作爲回調以避免錯誤?

什麼是我們的最佳做法?

傳遞函數並處理它報告的任何錯誤。您還需要處理來自mkdirreadFile的錯誤,該錯誤當前您將忽略。

例如爲:

fs.mkdir('stuff', function(err) { 
    if (err) { 
     // Do something with the fact mkdir failed 
    } else { 
     fs.readFile('readMe.txt', 'utf8', function(err, data) { 
      if (err) { 
       // Do something with the fact readFile failed 
      } else { 
       fs.writeFile('./stuff/writeMe.txt', data, function(err) { 
        if (err) { 
         // Do something with the fact writeFile failed 
        } 
       }); 
      } 
     }); 
    } 
}); 

...這是回調地獄,這是使用的承諾,而不是動機的一部分的公平例子。你可以promisify FS的API(使用任何一些庫,如promisify),並像這樣做:

fsp.mkdir('stuff') 
.then(() => fsp.readFile('readMe.txt', 'utf8')) 
.then(data => fsp.writeFile('./stuff/writeMe.txt', data)) 
.catch(err => { 
    // Do something with the fact something failed 
}); 

...其中fsp對於promisified FS API一個plaeholder。

在節點8.x中+,你可以使用async/await寫同步看代碼與promisified的API:

// This must be inside an `async` function 
try { 
    fsp.mkdir('stuff'); 
    const data = await fsp.readFile('readMe.txt', 'utf8'); 
    await fsp.writeFile('./stuff/writeMe.txt', data); 
} catch (err) { 
    // Do something with the fact something failed 
} 
+0

借調。始終處理錯誤以獲得最佳實踐。永遠不知道會出現什麼問題。 –

+0

Thx爲迴應,我會讀一點,所以我明白你的答案,然後我會接受它。 – user3784950

0

可以使用writeFileSync代替。

fs.mkdir('stuff', function(){ 
    fs.readFile('readMe.txt', 'utf8', function(err, data) { 
     fs.writeFileSync('./stuff/writeMe.txt', data); 
    }); 
}); 
+0

只是不在需要響應的服務器應用程序中。當然,一個控制檯腳本。但是在一個控制檯腳本中,你可以使用所有三個版本的'Sync'版本。 –

+0

我認爲節點的重點是在服務器應用程序中根本不使用阻塞同步版本? – user3784950

+0

是的。我只是提供了OP所要求的直接解決方案,這是一個沒有回調的「writeFile」。 –