Promise解決異步操作問題

問題:
當有多個回調函數後,就無法保證其輸出的順序性了,而採用嵌套的方式雖可以解決這個問題,但是代碼樣式太醜,且很亂,Promise的出現就是爲了解決這個問題

多個回調函數

var  fs = require('fs');
 fs.readFile('./files/1.txt','utf8',function(err,data){
   if(err){
     throw err;
   }
   console.log(data);
 })

 fs.readFile('./files/2.txt','utf8',function(err,data){
   if(err){
     throw err;
   }
   console.log(data);
 })

 fs.readFile('./files/3.txt','utf8',function(err,data){
   if(err){
     throw err;
   }
   console.log(data);
 })

嵌套

fs.readFile('./files/1.txt','utf8',function(err,data){
  if(err){
    throw err;
  }
  console.log(data);
  //讀取第二個異步任務
  fs.readFile('./files/2.txt','utf8',function(err,data){
    console.log(data);
    //讀取第三個異步任務
    fs.readFile('./files/3.txt','utf8',function(err,data){
      console.log(data);
    })
  })
})

起步

在 new Promise()容器放入回調函數

//語法:new Promise(function(callback){})
var  fs = require('fs');
var promise = new Promise(function(resolve,reject){
  //兩個參數 resolve 異步執行成功的回調函數,reject異步執行失敗的回調函數
  fs.readFile('./files/1.txt', 'utf8', function (err, data) {
    if (err) {
      throw err;
    }
    console.log(data);
  })
});

基本使用

在 new Promise()容器放入回調函數後,通過resolve將參數裏的值帶出來
then裏面的參數data就是resolve()括號裏的值
(簡化起見,不寫err)

var fs = require('fs');
var promise = new Promise(function (resolve) {
  fs.readFile('./files/1.txt', 'utf8', function (err, data) {
      resolve(data);
  })
});


promise.then(function (data) {
  console.log('成功:' + data); 
});

封裝

一層封裝

var fs = require('fs');


function getFile(path){
return new Promise(function (resolve) {
  fs.readFile(path, 'utf8', function (err, data) {
      resolve(data);
  })
});
}

getFile('./files/1.txt').then(function (data) {
  console.log('成功:' + data) 
})

對於代碼重複的回調函數可以鏈式使用.then封裝,如下

var fs = require('fs');


function getFile(path){
return new Promise(function (resolve) {
  fs.readFile(path, 'utf8', function (err, data) {
      resolve(data);
  })
});
}

getFile('./files/1.txt')
.then(function (data) {
  console.log('====>' + data)
  return getFile('./files/2.txt')
})
.then(function(data){
  console.log('====>' + data)
  return getFile('./files/3.txt')
})
.then(function(data){
  console.log('====>' + data)
})

執行多次異步操作

var promise1 = getFileByPath('./files/1.txt');
var promise2 = getFileByPath('./files/2.txt');
var promise3 = getFileByPath('./files/3.txt');


Promise.all([promise3,promise1,promise2]).then(function(data){
  console.log(data); 
},function(err){
  console.log(err);
})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章