并发

用 Promises 替代回调

回调不够整洁并会造成大量的嵌套。ES6 内嵌了 Promises,使用它吧。

反例:

  1. require('request').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin', function(err, response) {
  2. if (err) {
  3. console.error(err);
  4. }
  5. else {
  6. require('fs').writeFile('article.html', response.body, function(err) {
  7. if (err) {
  8. console.error(err);
  9. } else {
  10. console.log('File written');
  11. }
  12. })
  13. }
  14. })

正例:

  1. require('request-promise').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin')
  2. .then(function(response) {
  3. return require('fs-promise').writeFile('article.html', response);
  4. })
  5. .then(function() {
  6. console.log('File written');
  7. })
  8. .catch(function(err) {
  9. console.error(err);
  10. })

Async/Await 是较 Promises 更好的选择

Promises 是较回调而言更好的一种选择,但 ES7 中的 async 和 await 更胜过 Promises。

在能使用 ES7 特性的情况下可以尽量使用他们替代 Promises。

反例:

  1. require('request-promise').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin')
  2. .then(function(response) {
  3. return require('fs-promise').writeFile('article.html', response);
  4. })
  5. .then(function() {
  6. console.log('File written');
  7. })
  8. .catch(function(err) {
  9. console.error(err);
  10. })

正例:

  1. async function getCleanCodeArticle() {
  2. try {
  3. var request = await require('request-promise')
  4. var response = await request.get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin');
  5. var fileHandle = await require('fs-promise');
  6. await fileHandle.writeFile('article.html', response);
  7. console.log('File written');
  8. } catch(err) {
  9. console.log(err);
  10. }
  11. }