文章目錄
異步方法調用
主程序調用異步方法時,把其交給子程序,繼續執行下面代碼
導致獲取不到異步方法的返回值
function getFileByPath(fpath){
fs.getFile(fpath,'utf-8',(err,dataStr)=>{
if(err) throw err;
return dataStr;
})
}
getFilePath(path.join(__dirname,'./files/1.txt'));
添加回調函數,將結果返回給調用者
function getFileByPath(fpath,callback){
fs.getFile(fpath,'utf-8',(err,dataStr)=>{
//if(err) throw err;
//return dataStr;
if(err) return callback(err);
callback(datastr);
})
}
getFilePath(path.join(__dirname,'./files/1.txt'),(datastr)=>{
console.log(datastr+'_________')
});
調用者回調函數只能傳遞一個參數,導致不知道是否是成功還是失敗結果
所以規定:callback中的兩個參數,第一個是失敗結果,第二個是成功結果
若成功後,第一個參數null,第二個參數爲成功結果對象
若失敗後,第一個參數爲err對象,第二個參數爲undefine
getFilePath(path.join(__dirname,'./files/1.txt'),(error,datastr)=>{
if(err) return console.log(err.message)
console.log(datastr+'_________')
});
異步方法提高版
function getFileByPath(fpath,succCb,errCb){
fs.getFile(fpath,'utf-8',(err,dataStr)=>{
//if(err) throw err;
//return dataStr;
if(err) return errCb(err);
succCb(datastr);
})
}
getFilePath(path.join(__dirname,'./files/1.txt'),function(data){
console.log(data+"成功了")
},function(err){
console.log(err+"失敗了")
});
用異步方法同步讀取三個文件
同級方法不能保證順序,使用異步回調嵌套保證同步———回調地獄
使用ES6中的Promise來解決回調地獄問題——解決回調地獄問題
- Promise表示一個異步操作,每當new一個Promise實例,表示一個具體的異步操作
異步執行成功了。異步執行失敗了
因爲Promise是一個異步操作,所以無法使用return返回給調用者,只能通過回調函數返回給調用者 - resolve()成功回調函數
- reject()失敗回調函數
每當new一個Promise實例,就會立即執行這個異步操作中的代碼
const fs=require('fs')
var promise=new Promise(function(){
//編寫具體的異步操作
fs.readFile('./files/2.txt','utf-8',(err,datastr)=>{
if(err) throw err;
console.log(dataStr) ;
})
})
使用方法封裝這個Promise,實現:調用它就會立即執行的效果
function getFilePath(fpath){
var promise=new Promise(function(){
//編寫具體的異步操作
fs.readFile(fpath,'utf-8',(err,datastr)=>{
if(err) throw err;
console.log(dataStr) ;
})
})
}
promise實現回調函數
function getFilePath(fpath){
var promise=new Promise(function(resolve,reject){
//編寫具體的異步操作
fs.readFile(fpath,'utf-8',(err,datastr)=>{
if(err) return reject(err); //通過return組織下面執行
resolve(datastr);
})
})
}
通過.then方法爲Promise預先指定成功失敗方法
function getFilePath(fpath){
var promise=new Promise(function(resolve,reject){
//編寫具體的異步操作
fs.readFile(fpath,'utf-8',(err,datastr)=>{
if(err) return reject(err); //通過return組織下面執行
resolve(datastr);
})
})
return promise;
}
getFilePath('./files/2.txt').then(function(data){
//成功了
},function(err){
//失敗了
})
使用Promse同步調用異步方法
先讀取文件1,再讀取文件2,最後讀取文件3
## 成功必須傳,失敗可省略
## 若Promise執行失敗不想阻止後面繼續執行,則指定失敗的回調
getFilePath('./files/2.txt').then(function(data){
console.log(data)
return getFilePath('./files/2.txt')
},function(err){
console.log(data+"err")
return getFilePath('./files/2.txt')
})
.then(function(data){
console.log(data)
return getFilePath('./files/2.txt')
})
.then(function(data){
console.log(data)
return getFilePath('./files/3.txt')
})