Skip to content

并发处理

使用 Promise 而非回调函数

回调函数不够简洁且会导致代码过度嵌套。自 ES2015/ES6 起,Promise 已作为内置全局类型提供。建议使用!

不推荐:

javascript
import { get } from "request";
import { writeFile } from "fs";

get(
  "https://en.wikipedia.org/wiki/Robert_Cecil_Martin",
  (requestErr, response, body) => {
    if (requestErr) {
      console.error(requestErr);
    } else {
      writeFile("article.html", body, writeErr => {
        if (writeErr) {
          console.error(writeErr);
        } else {
          console.log("File written");
        }
      });
    }
  }
);

推荐:

javascript
import { get } from "request-promise";
import { writeFile } from "fs-extra";

get("https://en.wikipedia.org/wiki/Robert_Cecil_Martin")
  .then(body => {
    return writeFile("article.html", body);
  })
  .then(() => {
    console.log("File written");
  })
  .catch(err => {
    console.error(err);
  });

Async/Await 比 Promise 更为简洁

Promise 是回调函数的有效替代方案,但 ES2017/ES8 引入的 async 和 await 提供了更简洁的解决方案。开发者只需在函数前添加 async 关键字,即可使用命令式语法编写逻辑,无需通过 then 方法链式调用。建议优先采用此方案,以充分发挥 ES2017/ES8 语言特性的优势!

不推荐:

javascript
import { get } from "request-promise";
import { writeFile } from "fs-extra";

get("https://en.wikipedia.org/wiki/Robert_Cecil_Martin")
  .then(body => {
    return writeFile("article.html", body);
  })
  .then(() => {
    console.log("File written");
  })
  .catch(err => {
    console.error(err);
  });

推荐:

javascript
import { get } from "request-promise";
import { writeFile } from "fs-extra";

async function getCleanCodeArticle() {
  try {
    const body = await get(
      "https://en.wikipedia.org/wiki/Robert_Cecil_Martin"
    );
    await writeFile("article.html", body);
    console.log("File written");
  } catch (err) {
    console.error(err);
  }
}

getCleanCodeArticle()