一、異步編程
首先函數是一等公民,可以作爲函數參數或者函數返回值
1、首先舉個函數工廠的例子,顧名思義,用來生產函數,這個例子是判斷一個變量的類型
function isType(type){
return function(param){
return Object.prototype.toString().call(param)==`[object ${type}]`;
}
}
判斷是否是字符串,數組
let isString = isType('String');
isString('aa'); //true
2、實現前兩次調用函數不執行,第三次調用時調用時才執行函數
function after(times,fn){
var count=0;
if(++count==times){
fn();
}
}
3、nodeJs異步讀取文件案例
//引入node的fs模塊
let fs = require('fs');
fs.readFile('./1.txt','utf-8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
}
})
這裏有些知識點需理解:
回調函數的問題
無法捕獲錯誤 try catch | 因爲先執行下圖中的(1)不會報錯誤,等回調函數執行後,catch已經執行結束了,不會在捕獲錯誤了 |
無法用return | 因爲是異步,在賦值的時候還沒有值 |
回調地域(當嵌套請求多時) | 多次串行請求 |
如果讀取一個文件,可以這樣寫,如果需要先讀取1.txt,再讀取2.txt,最後取到所有數據進行展示,需要寫爲:
//引入node的fs模塊
let fs = require('fs');
fs.readFile('./1.txt','utf-8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
var data1=data;
fs.readFile('./2.txt','utf-8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data1+data)
}
})
}
})
如何解決上述問題
(1)通過事件發佈訂閱來實現
(2)哨兵函數
var result={};
function done(key,value){
result[key] =value;
if(Object.keys().length == 2){
console.log(result)
}
}
fs.readFile('./1.txt','utf-8',function(err,data){
if(err){
console.log(err)
}else{
done('data1',data)
}
})
fs.readFile('./2.txt','utf-8',function(err,data){
if(err){
console.log(err)
}else{
done('data2',data)
}
})
優化
二、generator函數,是一個生成器函數,會產生迭代函數。
生成器函數和普通的函數不一樣,調用時函數不會立即執行,會返回一個生成器的迭代器,迭代器是一個對象,每調用一次next就可以返回一個值對象、
function *go(){
console.log("1");
let b = yield 'a';
console.log("2");
let c = yield 'b';
console.log("3");
return c
}
let b = yield 'a';
這一行代碼用於實現輸入和輸出,本次的輸出放在yield後面,下次的輸入放在yield前面。