異步編程&promise(一)

一、異步編程

首先函數是一等公民,可以作爲函數參數或者函數返回值

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前面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章