文件模块一

也就是说,在使用JSX的代码文件里面,即使代码中并没有直接使用React,也一定要导入React,这是因为JSX最终会被转译成依赖于React的表达式。

Node的文件模块是由POSIX标准的文件操作包装而来的。

Node文件模块中的函数既有异步版本又有同步版本,异步版本的最后一个函数经常都是回调函数,并且这个回调函数的第一个参数经常都是一个异常,如果异步操作成功了的话,那么这个异常就将会是null或者undefined。需要指出的是,null和undefined转换为布尔值都是false。

对于同步版本的运行来说,异常是立马被抛出的。所以对于同步版本的运行来说,使用try...catch...来捕获异常是十分有必要的。

下面就同步/异步问题举个例子,这里使用文件系统的unlink函数——删除文件来举个例子:

const fs = require('fs')
fs.unlink('./1.txt', (err) => {
  if(err){console.log(err)}
  console.log('delete success!')
})
//同步版本
try{
  fs.unlinkSync('./1.txt')
}catch(err){
  console.log(err)
}
console.log('delete success')

异步操作是不会堵塞后续操作的,正是由于这一点,所以对于异步函数来说,他们执行的顺序和代码的顺序是无关的。也正是由于这一点,造成了对于某些复杂的场景来说,硬要让异步代码模拟出那种情况的话那么将会出现可怕的地狱回调。下面就这种不确定性举个例子:

const fs = require('fs')
fs.rename('./1.txt', './2.txt', (err) => {
  if(err){console.error(`rename 1.txt accurs error --> ${err}`)}
  console.log('rename successful')
})
fs.stats('./2.txt', (err, stats) => {
  if(err){console.error(`find the t0607_3_0 status accues error --> ${err}`)}
  console.log(`file status:\t${JSON.stringify(stats)}`)
})

运行上面的那个例子,很可能就会抛出错误提示找不到2.txt文件,这是为什么呢?因为fs.rename()函数并不会阻塞fs.stats()函数,所以很可能在fs.rename()函数还没有执行完的时候,fs.stats文件已经开始执行了,因此抛出错误。毕竟fs.stats()函数所需要的花销会大于fs.rename()函数。对于这种问题,正确的做法那就是把后续操作放在前一操作的回调函数里面,这样带来的问题那就是大量的回调了。嚯嚯嚯。

尽管利用异步函数来描述工作流有点拗口,但是利用异步方式的处理方法在某些场景下具有特别明显的性能提升!值得庆幸的是,ES2015和Node8的Promise,async,await和node中util模块的promiseify方法能够减轻地狱回调的出现。像下面这样:

const { promisify } = require('util')
const fs = require('fs')
const rename_promise = promisify(fs.rename)
const stat_promise = promisify(fs.stat)
rename_promise('./t0607_3_0.js', './t0607_3.js')
    .then(() => {
        stat_promise('./t0607_3.js')
            .then((stats) => {console.log(JSON.stringify(stats))})
            .catch((err) => {console.log('stat error')})
    })
    .catch((err) => {
        console.log('rename error')
    })

好像还是挺丑的。。。累觉不爱。。

1.fs.Watcher类

由fs.watch()函数所返回的对象就是一个fs.Watcher类所实例化的对象,再多嘴几句fs.watch()函数,他的callback就是返回对象的change事件的处理函数,而不是关于异常处理的函数。WTF。。就fs.Watcher()类实例化的对象而言,它能够发射下面的事件:

  • change:(eventType, fileName) => {}
  • error:(err) => {}

他所实例化出来的对象具有下面的方法:

  • close:关闭对其文件的监视行为
    下面就其API举几个例子:
const fs = require('fs')

const fsWatcher = fs.watch(__dirname+'/1.txt', (eventType, fileName) => {
    console.log(`EventType: ${eventType}\tFileName: ${fileName}`)
})
fsWatcher.on('error', (err) => {console.log(`Appear error in the watch process: ${err}`)})

fs.appendFile(__dirname+'/1.txt', 'world', (err) => {
    if(err){console.error(`Appear error in append file process in line8: ${err}`)}
})

上面代码写得很糙,因为如果fs.watch()是异步函数的话,那么两个异步函数的执行顺序那可是没有担保的。

2.fs.ReadStream类

fs.ReadStream类用来描述一种可读流的行为。可读流是一种抽象的概念。我们在这里不予多加介绍。下面介绍一下这个类所能够发送的事件以及这个类所实例化出来的对象所拥有的事件和属性:

  • close事件:当ReadStream在底层所对应的那个文件描述符通过fs.close()所关闭的时候会发射这个事件。
  • open事件:当ReadStream在底层所对应的那个文件被打开了的时候会发射这个事件。事件处理函数接收一个整形参数表示文件描述符。(fd:integer)=>{}
  • readstream.bytesRead:这个属性表示的是这个到目前为止所读的字节数。
  • readstream.path:所读文件的路径,返回的这个路径是由fs.createReadStream(path)函数的第一个参数所显式指明的,如果这个参数是字符串的话,那么返回的路径也以字符串的形式返回;如果这个参数是Buffer类型的话,那么返回的这个路径也将以Buffer的形式返回。

3.fs.Stats类

这个类型的对象会由下列的函数返回:fs.stat,fs.lstat,fs.fstat以及他们各自的异步版本。这个数据类型所实例化出来的对象具有下列的方法:

  • stats.isFile():判断是否是文件
  • stats.isDirectory():判断是否是文件夹
  • stats.isBlockDevice():判断是否为块设备,比如说磁盘
  • stats.isCharacterDevice():判断是否为字符设备,比如说键盘,打印机
  • stats.isSymbolicLink():判断是否为软链接
  • stats.isFIFO():判断是否为FIFO设备
  • stats.isSocket():判断是否为Socket

END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容