并发

使用 Promises, 不要使用回调

回调不够简洁, 因为他们会产生过多的嵌套。 在 ES2015/ES6 中, Promises 已经是内置的全局类型
了,使用它们吧!

不好的:

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

好的:

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

Async/Await 比 Promises 更加简洁

Promises 是回调的一个非常简洁的替代品, 但是 ES2017/ES8 带来的 async 和 await 提供了一个
更加简洁的解决方案。 你需要的只是一个前缀为 async 关键字的函数, 接下来就可以不需要 then
函数链来编写逻辑了。 如果你能使用 ES2017/ES8 的高级功能的话, 今天就使用它吧!

不好的:

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

好的:

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