NodeJS相關筆記(三)

1.mvc
◆mvc原本是後端的,一個分層的概念,後來前端的技術偷換過去了,和後端有很大的區別,只是做了一個分層,angular是mvc模型的一個進化。


2.mvvm模型
◆後端的mvc,大多是靠controller,而前端的mvc大多是靠model和view,所以衍生出了mvvm,model、 view 、viewmodel($scope,他的作用性遠大於controller,把控制器層給遮住了)。


2.angularjs雙向綁定,監聽了頁面的元素,同時也監聽了$scope,所以纔可以實現雙向綁定,angularjs內部的機制,使用$scope.$watch【
// 初始化數據模型
$scope.name=1;
// 監視數據模型的變化
// 第一個參數,數據模型名的字符串形式
 // 第二個參數,是一個回調函數:有兩個參數,分別是變化後的值,和變化前的值
$scope.$watch('name',function(nowValue,oldValue){
                     $scope.name=$scope.name+1;
                   console.log(nowValue);
                  console.log(oldValue);
             })



3.angular中的定時器
◆$interval(),使用方式和setInterval()一樣。
◆但是如果你單獨使用setInterval(),然後在裏面修改$scope的值,那麼一定要使用$scope.$apply(),不然就沒有效果,因爲$interval()內部調用了$scope.$apply()的。
◆不在AngularJS的控制範圍內去修改$scope裏的值,需要手動去調用$scope.$apply()。


4.IO與併發
◆大量的IO操作叫做高IO,IO就是讀寫文件,數據的流動。
◆使用nodejs,普通的電腦可以響應千級別的併發,短暫的時間段內有幾個程序都處於運行開始到運行完畢之間。


5.進程與線程
◆進程是爲運行當中的應用程序提供運行環境的,一個運行當中的應用程序就會有一個進程與之相對應。
◆線程是用來運行應用程序中代碼的,一個線程在一個時間只能做一件事件,多線程就是多個線程同時在工作,其實就是快速的切換,但是調度起來很麻煩,node是單線程執行,使用了異步替代多線程,事件環機制。


6.異步與同步:
◆ajax
◆setTimeout
◆setInterval
◆同步代碼會阻塞主線程,所以你如果不開啓一個線程來執行異步代碼,那麼異步代碼再牛,都會先執行同步代碼然後再執行異步代碼。
◆異步代碼會放到一個隊列裏,先執行同步代碼,然後再執行異步代碼,所以所有的異步代碼都會被同步代碼阻塞。



7.異步非i/o操作和異步i/o操作
◆異步非io: setTimeout setInterval,異步的代碼會被放入隊列,等同步全部執行完畢,再從隊列中去,這時候異步代碼也就相當於同步代碼了。
◆異步IO操作: 操作文件 網絡操作 fs
◆異步IO操作不會阻塞,原理是因爲nodejs底層還是多線程的,雖然表面是單線程的,例如對IO操作會開新線程,其它無關IO的callback操作就會放到事件隊列中去。
◆單線程體現在事件環機制(單線程的執行同步代碼,異步代碼放到隊列中,同步代碼都執行完畢後再從隊列中取),多線程式體現在非阻塞式IO(有一個線程池專門用來處理IO問題)。
◆linux操作系統下的nodejs的線程池是自己寫的,而windows操作系統下的nodejs的線程池是windows操作系統提供的,所以linux操作系統下的nodejs的線程池要好用些,因爲畢竟是自己寫,自己寫的就知道自己要什麼。


8.nodejs的優勢與劣勢
◆node的異步是幫助我們去做了多線程的操作,簡化了代碼。
◆多線程的好處是可以進行cpu密集型(大量的運算)的操作,但是nodejs不適合開發這種cpu密集型(大量的運算)的應用,因爲nodejs是單線程的,它的多線程只針對IO操作。


9.nodejs的核心機制:異步流程控制,也就是同步代碼去寫異步,大多數情況下,return用於同步,callback用於異步。


10.agularjs的髒檢查,之所以髒,是因爲機制如此,每一次髒檢查都至少會循環兩次,但是最多隻給你循環十次,髒檢查十次就會跳出,然後就over+error了。
◆數據監聽:$scope.$watch()
◆循環方法:$scope.$digest()
◆觸發髒檢查:$scope.$apply()
◆帶$的方法修改$scope,都會觸發髒檢查,如果不帶$就需要使用$apply()來觸發觸發。
◆檢查數據是否發生變化,如果發生變化就同步到頁面。


11.require引入其它文件或者模塊兒時,並不是直接將那些文件的代碼或者模塊兒直接引入到當前文件中的,而是通過接收文件或者模塊兒返回的數據的。


12.文件操作
◆__dirname:當前文件所在的目錄,也就是你在哪個文件寫了__dirname,那麼他就獲取該文件所在的目錄名(絕對路徑)
◆fs模塊兒->操作文件->io->nodejs的特長
◆fs模塊兒是node非常重要的模塊兒,能體現出node的優勢
◆fs.readFile()讀文件
◆fs.writeFile()寫文件:多次寫入一個文件就會覆蓋,文件不存在就會創建新文件,但是不會創建新文件夾【
//異步寫文件 路徑 內容 編碼 回調
fs.writeFile('./1.js','hillo hillo','utf8',(err)=>{
console.log('err');
});
fs.writeFileSync('./1.js','hillo hillo','utf8')這是同步寫文件。
//異步IO由線程池進行操作,所以最好不要同時操作同一個文件,如果異步IO和同步IO同時進行,那麼就會有爭奪文件使用權的問題,會error的。

◆fs.appendFile()在文件的內部去追加一些內容
◆fs.mkdir()創建文件夾,使用的是linux下的命令,mkdir創建文件夾,一般nodejs官網的文檔中如果沒有詳細的寫說明,那麼就是直接調用的linux下的命令,那麼可以直接搜索 linux 方法名就能夠搜索出來,一般在linux下操作文件,這個方法都會有一個mode的可有可無的參數,表示權限【
fs.mkdir('./a',function(err){
})
】。
◆fs.readdir()讀文件夾【
fs.readdir('./a',(err,files)=>{
console.log(files);
})

◆fs.access()判斷路徑
◆fs.stat()更加詳細的判斷文件或者文件夾【
fs.stat('./a',(err,stats)=>{
//通過stats的衆多方法可以更加詳細的進行判斷,如是不是文件、是不是文件夾、
if(stats.isFile());//文件
if(stats.isDirectory);//文件夾
  if(isSymbolicLink);//快捷方式
})

◆path:是對路徑進行操作的模塊兒
◆path.join(__dirname,'./f.text');:表示拼接兩個路徑,返回一個正確的路徑,這個方法很常用。
◆path.basename('./ss/xx/sss/f.txt');:會輸出f.txt,可以用來獲取文件名加後綴名,你也可以指定去掉後綴名,如path.basename('./ss/xx/sss/f.txt','.txt');,會輸出f。
◆path.dirname('./ss/xx/sss/f.text');:會輸出./ss/xx/sss/,可以用來獲取路徑,但是不帶文件名加後綴名。
◆path.extname('./ss/xx/sss/f.txt');,會輸出.txt,會輸出文件的後綴名。



13.異常處理
◆計算機不能處理的狀況稱之爲異常
◆nodejs中的同步代碼如果出錯了,那麼會直接報錯,進程崩潰。
◆nodejs中的異步IO代碼如果出錯了,那麼會返回一個錯誤對象,進程不會崩潰。
◆nodejs中的異步IO代碼出錯返回的錯誤對象和try-catch返回的錯誤對象是一樣的。
◆try{}catch{}finally{},異步IO代碼中使用了異常處理,所以同步代碼需要大量的try-catch。
◆你自己不要給異步代碼進行try-catch的包裹,因爲異步代碼裏面已經有了異常處理了,try-catch本身就是同步代碼,同步代碼比異步代碼先執行,所以無效,try--catch放在callback中還是有效的。
◆自定義異常: var err=new Error('this is error');
◆使用自定義異常:throw err;,這時候錯誤信息就會顯示到堆棧信息中。
◆自定義異常時,可以通過設置err.code來進行判斷是什麼樣的錯誤,就相當於自定義枚舉一樣。
◆異常的處理尤爲重要,如果處理的好,程序可以自己對自己進行錯誤修復。


14.高級的公司,會直接給你配mac、類linux操作系統的,再不然就是讓你刪掉windows操作系統讓你安裝一個ubuntu。


15.雙向數據綁定的應用場景
◆用在單頁面上進行實時更新的一些數據
◆股票的走勢、貴金屬交易筆數、購物車裏的實時計算


16.做一個項目WM(WordMarkup),寫一個框架,寫幾個UI,就能夠用了,可能要幾年也可能做不成,但是沒有關係。


17.angularjs中的控制器,父級的$scope裏的屬性或者方法會被子級繼承,子級如果有就不會再繼承了,應用程序的model叫做$rootscope,也就是最根部的$scope了。


18.樹形結構遍歷
◆深度優先遍歷:一直往下,直到沒有了,那麼再往上一層,再往下,沒有了,那麼再往上,一層一層往下,下沒有了就往上。
◆廣度優先遍歷:分層來就是廣度,就像剝洋蔥一樣。
◆angularjs遍歷$scope是以深度優先遍歷爲準

發佈了111 篇原創文章 · 獲贊 3 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章