需求:在本地有一個(gè)文件炫加,判斷如果這個(gè)文件存在的話,就把該文件刪除后在創(chuàng)建一個(gè)新的文件铺然,如果不存在就直接創(chuàng)建 俗孝。
/**
* Created by 黃森 on 2017/6/3.
*/
// 引入文件操作fs模塊
const fs = require("fs");
console.time('timer');
fs.stat('./list.md', (err, stats) => { //一
if (err) {
console.log("文件不存在");
fs.writeFile('./list.md', new Date(), (err) => { //二
if (err) {
console.error(err);
return false
}
console.log("文件創(chuàng)建成功")
});
return false;
}
//存在的話刪除
fs.unlink('./list.md', (err) => {
if (err) {
console.error(err);
return false
}
fs.writeFile('./list.md', new Date(), (err) => {
if (err) {
console.error(err);
return false
}
console.log("文件刪除后創(chuàng)建成功")
})
})
});
console.timeEnd('timer');
執(zhí)行過(guò)程
Node執(zhí)行過(guò)程.png
首先一個(gè)線程從上往下開(kāi)始執(zhí)行代碼,當(dāng)遇到
fs
調(diào)用的函數(shù)之后就比較特殊了魄健,它是事件驅(qū)動(dòng)的赋铝,它里面有一個(gè)事件隊(duì)列,所謂的事件隊(duì)列就是一個(gè)鍵值的結(jié)構(gòu)沽瘦,node
在執(zhí)行的過(guò)程中遇到函數(shù)調(diào)用革骨,就把該函數(shù)放到事件隊(duì)列里面农尖,然后去執(zhí)行它的回掉函數(shù),檔執(zhí)行到最后的時(shí)候苛蒲,又回到事件隊(duì)列去找卤橄,找到上一次執(zhí)行回掉函數(shù)里面的函數(shù)操作,然后上一次的回掉函數(shù)銷毀臂外,依次類推窟扑,依次執(zhí)行。
Paste_Image.png
在舉個(gè)例子漏健,代碼如下:
Paste_Image.png
那么這個(gè)程序函數(shù)的執(zhí)行:當(dāng)執(zhí)行到第一個(gè)
fs.stst
的時(shí)候添加到事件隊(duì)列中嚎货,即添加fs.stat(a)=>ststCallback1
,當(dāng)執(zhí)行到第二個(gè)的時(shí)候把fs.stat(b)=>ststCallback2
頁(yè)添加到事件隊(duì)列中,最后執(zhí)行到consonle.timeEnd('timer')
后執(zhí)行完了蔫浆,完了之后又回到事件隊(duì)列去找第一個(gè)fs.stat(a)=>ststCallback1
,找到它里面fs.readFile(a)
這個(gè)函數(shù)殖属,添加到事件隊(duì)列中執(zhí)行完,然后fs.stat(a)=>ststCallback1
銷毀瓦盛,去找到fs.stat(b)=>ststCallback2
中fs.readFile(b)
這個(gè)函數(shù)洗显,執(zhí)行完后fs.stat(b)=>ststCallback2
銷毀,接著又去事件中去找執(zhí)行fs.readFile(a)
的回掉函數(shù),執(zhí)行完之后去執(zhí)行fs.readFile(b)
的回掉原环,就這樣來(lái)回的跳挠唆。