Oasis's Cloud

一个人的首要责任,就是要有雄心。雄心是一种高尚的激情,它可以采取多种合理的形式。
—— 《一个数学家的辩白》

系统编程


背景简述

本章内容主要围绕这 JavaScript 的异步特性展开。异步特性也是 JavaScript 于其他语言的最大差别。JavaScript 中的异步处理主要是为了解决 I/O 问题。因为 I/O 的处理时需要 CPU 需要等待。I/O 所耗费的时间和 CPU 比起来可以说是天壤地别。

我们来看看时间的概念:

JavaScript 在初期可以通过 Callback 方式实现异步。ES6 版本之后已经添加了 Promise、async await。

列出目录

代码 1:

import fs from 'fs'

const srcDir = process.argv[2]
const results = fs.readdir(srcDir)
for(const name of results) {
   console.log(name)
}

概念解析:

  1. process 是什么?
  2. node.js 中 process 对象提供了当前 node.js 进程的信息,并对其进行控制。argv 是一个数组,包含启动 node.js 进程时的命令行参数
  3. node test.js -a describe1
  4. process.argv[0] 是 bin 文件的路径 /usr/local/bin/node
  5. process.argv[1] 是 执行的脚本文件 test.js
  6. process.argv[2] 是 参数 -a
  7. process.argv[2] 是 参数 describe1
  8. node.js 可以使用 import 吗?
  9. node.js 默认使用 require 方式,如果采用 import 方式的话,需要将 package.json 文件中的 type 设置为 module

代码 1 并不会正常工作,而是会报错:Callback muse be a function。所以需要给它添加一个 function,对数据进行处理。

在 Node.js 中有这样一个观念需要明确:错误先行。至于为什么,我们看如下三个论点。

  1. 任何一个程序至少包含一个 bug
  2. 任何一个程序可以缩短一行。
  3. 因此,任何一个程序可以简化为一条错误语句。

代码 2:

import fs from 'fs' 

const listContents = (err, files) => {
    if(err) console.error(err)
    else console.log(files)
}

const srcDir = process.argv[2]
const results = fs.readdir(srcDir, listContents)

选择一组文件

在很多 node.js 项目中,我们经常看到 glob 模块。glob 是 “global” 的缩写。glob 是一个古老的 Unix 术语,用于按名称匹配一组文件。所以,我们在程序设计中很多概念是相同的,或者很多现有思想是可以借鉴的。

概念解析:

  1. npm glob
  2. https://www.npmjs.com/package/glob
  3. https://man7.org/linux/man-pages/man3/fnmatch.3.html
  4. https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html
  5. https://www.linuxjournal.com/content/pattern-matching-bash