Es6中的Promise

異步方法調用

主程序調用異步方法時,把其交給子程序,繼續執行下面代碼
導致獲取不到異步方法的返回值

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來解決回調地獄問題——解決回調地獄問題

  1. Promise表示一個異步操作,每當new一個Promise實例,表示一個具體的異步操作
    異步執行成功了。異步執行失敗了
    因爲Promise是一個異步操作,所以無法使用return返回給調用者,只能通過回調函數返回給調用者
  2. resolve()成功回調函數
  3. 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')
})    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章