異步編程--Promise任務鏈

講解Promise任務鏈之前先看一個例子

        new Promise( (resolve, reject) => {
			reject();
		} ).then( 
			() => {
				console.log('resolve', 1);
			},
			() => {
				console.log('reject', 2);
			}
		).then( 
			() => {
				console.log('resolve', 3);
			},
			() => {
				console.log('reject', 4);
			}
		);

猜猜控制檯會打印什麼東西呢,正確答案是

'reject', 2

'resolve', 3

想知道爲什麼,繼續往下看

Promise Chain     

      then函數執行後會返回一個新的Promise對象

如果then沒有傳入處理函數,那麼會返回一個繼承了上一個處理狀態的 Promise 對象

new Promise( (resolve, reject) => {
			reject();
		} ).then().then(() => {
			console.log(1)
		},() => {
			console.log(2)
		})

上面代碼會打印2。

如果then傳入處理函數,那麼默認返回一個 fulfilled/resolved 狀態的 Promise 對象

new Promise( (resolve, reject) => {
			reject();
		} ).then(() => {
			console.log(1);
		},() => {
			console.log(2)
		}).then(() => {
			console.log(3)
		},() => {
			console.log(4)
		})

上面代碼會打印2,3

如果then傳入了處理函數,通過處理函數顯示的return了一個新的 Promise,那麼返回這個顯示的 Promise 對象

new Promise( (resolve, reject) => {
			reject();
		} ).then(() => {
			console.log(1);
		},() => {
			console.log(2);
			return new Promise((resolve, reject) => {
				reject();
			})
		}).then(() => {
			console.log(3);
		},() => {
			console.log(4);
		})

上面代碼會打印2,4。

到這裏一開始的問題就清楚了。但是,還會導致一個問題

問題:         

不易中途終止後續任務執行

看下面一個例子就知道了

	<script type="text/javascript">

		new Promise( (resolve, reject) => {
			resolve();
		} )
		.then(() => {
			console.log('登錄成功')
			// 獲取權限
			return new Promise( (resolve, reject) => {	
				if (false) {	//是否是管理員
					resolve();
				} else {
					reject();
				}
			} )
		},() => {
			console.log('登錄失敗')
		})
		.then(() => {
			console.log('是管理員')
			// 獲取資源
			return new Promise( (resolve, reject) => {
				resolve();
				// reject();
			} )
		},() => {
			console.log('不是管理員')
		})
		.then(() => {
			console.log('拿到資源')
		},() => {
			console.log('不能獲取資源')
		});


	</script>

打印結果爲

上面當他不是管理員的時候,我們根本就不想讓他拿到資源,甚至都不想發這個請求,那怎麼辦呢? 

.catch方法     

處理 rejected 的情況,與 then 的第二個參數 onRejected 相同     

返回一個 Promise 對象,狀態默認爲 fulfilled/resolved     

可以捕獲 catch 之前的 Promise Chain 中的任一錯誤(如果 Promise Chain 中的 then 沒有處理的話)

	<script type="text/javascript">

		new Promise( (resolve, reject) => {
			resolve();
		} )
		.then(() => {
			return new Promise( (resolve, reject) => {
				reject('登錄失敗');
			} )
		})
		.then(() => {
			console.log('是管理員')
		})
		.then(() => {
			console.log('拿到資源')
		}).catch(err => {
			console.log(err);
		}).then(() => {
			console.log('catch以後')
		});


	</script>

 

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