使用ES6中的Promise解決回調地獄的問題

首先簡單介紹下Promise

解釋在程序的註釋裏

//1.Promise是一個構造函數,我們可以new Promise()得到一個Promise的實例
//2.在Promise上,有兩個函數,分別是resolve(成功之後的回調函數)和reject(失敗之後的回調函數)
//3.在Promise構造函數的Prototype屬性上,有一個.then()方法,只要是Promise構造函數創建的實例,
//都可以訪問到.then()方法
//4.Promise表示一個異步操作,每當我們new一個Promise的實例,就表示一個具體的異步操作
//5.異步操作的結果兩種狀態:異步執行成功了,需要在內部調用成功的回調函數resolve把結果返回給調用者;
//                        異步執行失敗了,需要在內部調用失敗的回調函數reject把結果返回給調用者。
//6.由於是異步操作,內部拿到操作的結果後,無法使用return把操作的結果返回給調用者;這時候,只能
//使用回調函數的形式,來把成功或失敗的結果,返回給調用者。
//7.可以在new出來的Promise實例上,調用.then()方法,預先爲這個Promise異步操作指定成功(resolve)和失敗(reject)的回調函數

const fs = require('fs')

//每當new一個promise實例,就會執行這個異步操作中的代碼
// var promise = new Promise(function(){
// 	//這個function內部寫的就是具體的異步操作
// 	fs.readFile('./1.txt','utf-8',(err,dataStr) => {
// 		if (err) {
// 			throw err
// 		}
// 		console.log(dataStr)
// 	})
// })

function getFileByPath(fpath){
	return new Promise(function(resolve,reject){
	//這個function內部寫的就是具體的異步操作
		fs.readFile(fpath,'utf-8',(err,dataStr) => {
		// if (err) {
		// 		throw err
		// }
		// console.log(dataStr)
		
			if (err) return reject(err)
			resolve(dataStr)

		})
	})
}

getFileByPath('./1.txt')
	.then(function(data){
		console.log(data+'-------')
	},function(err){
		console.log(err.message)
	})

接下來開始解決回調地獄的問題

註釋掉的部分是解除後續Promise對前面Promise依賴的調用方式
(即哪怕前面的Promise執行失敗了,但是不要影響後續Promise的正常執行。)

const fs = require('fs')

function getFileByPath(fpath){
	return new Promise(function(resolve,reject){
		fs.readFile(fpath,'utf-8',(err,dataStr) => {
		
			if (err) return reject(err)
			resolve(dataStr)

		})
	})
}

//先讀取文件1,再讀取2,最後讀取3
//在上一個.then中返回一個新的Promise實例,可以繼續用下一個.then來處理

//如果前面的Promise執行失敗,我們不想讓後續的Promise操作被終止,我們可以爲每個promise制定失敗的回調
// getFileByPath('./11.txt')
// 	.then(function(data){
// 		console.log(data)

// 		return getFileByPath('./2.txt')
// 	},function(err){
// 		console.log('這是失敗的結果:'+err.message)
// 		//return一個新的Promise對象
// 		return getFileByPath('./2.txt')
// 	})
// 	.then(function(data){
// 		console.log(data)

// 		return getFileByPath('./3.txt')
// 	})
// 	.then(function(data){
// 		console.log(data)
// 	})

// console.log('OKOKOK')

//當我們的需求是:哪怕前面的Promise執行失敗了,但是不要影響後續Promise的正常執行,此時,
//我們可以單獨爲每個promise,通過.then指定一下失敗的回調。

//如果我們的需求是:如果後續的Promise依賴於前面Promise執行的結果,如果前面的失敗了,則後面的
//就沒有繼續執行下去的意義了,此時我們想要實現一旦有報錯就立即終止所有Promise的執行。

getFileByPath('./1.txt')
	.then(function(data){
		console.log(data)

		return getFileByPath('./22.txt')
	})
	.then(function(data){
		console.log(data)

		return getFileByPath('./3.txt')
	})
	.then(function(data){
		console.log(data)
	})
	.catch(function(err){//如果前面有任何的Promise執行失敗,則立即終止所有Promise的執行,並
		// 馬上進入catch去處理Promise中拋出的異常。
		console.log('這是自己的處理方式:'+err.message)
	})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章