1. 程式人生 > 其它 >Promise物件呼叫

Promise物件呼叫

技術標籤:前端jsjavascript

promise正常呼叫

// 非同步方法,返回一個promise
function asynchronousFun(val){
	return new Promise((resolve,reject) => {
		if(val){
			resolve(val);
		}else{
			reject("error");
		}
	})
}



asynchronousFun("num01")
.then( res => {
	return asynchronousFun( res+"::num02"
); }) .then( res => { return asynchronousFun( res +"::num03"); }) .then( res => { console.info("res是:"+res); }) .catch( res => { console.error(res); })

程式碼執行結果:res是:num01::num02::num03

reject情況

// 非同步方法,返回一個promise
function asynchronousFun(val){
	return new Promise((resolve,
reject) => { if(val){ resolve(val); }else{ reject("error"); } }) } asynchronousFun() // 此處不傳參,呼叫reject .then( res => { console.info("第一次回撥函式執行"); return asynchronousFun( res+"::num02"); }) .then( res => { console.info("第二次回撥函式執行"); return
asynchronousFun( res +"::num03"); }) .then( res => { console.info("第三次回撥函式執行"); console.info("res是:"+res); }) .catch( res => { console.error("發生錯誤::",res); })

程式碼執行結果:
在這裡插入圖片描述
由執行結果可看出:一旦reject,直接被catch捕獲,後面的then都不會再執行。(reject相當於丟擲異常)
下面繼續測試,檢視控制檯輸出情況來驗證上述總結。

  • 一旦reject,後臺面的then都不會執行
// 非同步方法,返回一個promise
function asynchronousFun(val){
	return new Promise((resolve,reject) => {
		if(val){
			resolve(val);
		}else{
			reject("error");
		}
	})
}



asynchronousFun("num01") 
.then( res => {
	console.info("第一次回撥函式執行");
	return asynchronousFun();// 此處不傳參,呼叫reject,檢查控制檯輸出
})
.then( res => {
	console.info("第二次回撥函式執行");
	return asynchronousFun( res +"::num03");
})
.then( res => {
	console.info("第三次回撥函式執行");
	console.info("res是:"+res);
})
.catch( res => {
	console.error("發生錯誤::",res);
})

在這裡插入圖片描述

  • 手動丟擲異常(reject相當於丟擲異常)
// 非同步方法,返回一個promise
function asynchronousFun(val){
	return new Promise((resolve,reject) => {
		if(val){
			resolve(val);
		}else{
			reject("error");
		}
	})
}



asynchronousFun("num01") 
.then( res => {
	console.info("第一次回撥函式執行");
	throw new Error("丟擲一個異常"); //手動丟擲異常
})
.then( res => {
	console.info("第二次回撥函式執行");
	console.log("就到這裡吧");
	return "就到這裡吧";
})
.then( res => {
	console.info("第三次回撥函式執行");
	console.info("res是:"+res);
})
.catch( res => {
	console.error("發生錯誤::",res);
})

在這裡插入圖片描述

Promise鏈式呼叫

then()方法返回的是一個新的promise物件。

then方法體中 return 語句,即為返回的這個promise物件的回撥函式的引數;即下一個then()方法的引數。
// 非同步方法,返回一個promise
function asynchronousFun(val){
	return new Promise((resolve,reject) => {
		if(val){
			resolve(val);
		}else{
			reject("error");
		}
	})
}
asynchronousFun("num01") 
.then( res => {
	console.info("第一次回撥函式執行");
	return asynchronousFun( res+"::num02");
})
.then( res => {
	console.info("第二次回撥函式執行");
	console.log("就到這裡吧");
	return "就到這裡吧";
})
.then( res => {
	console.info("第三次回撥函式執行");
	console.info("res是:"+res);
})
.catch( res => {
	console.error("發生錯誤::",res);
})

在這裡插入圖片描述

由執行結果可知,第二個then執行完成後,返回一個字串。後續的then依然能正確執行。就是因為then返回的是一個promise物件。而從列印結果可知:return返回的物件即為下一個then 回撥函式的引數。

  • 來看看沒有return語句的情況
// 非同步方法,返回一個promise
function asynchronousFun(val){
	return new Promise((resolve,reject) => {
		if(val){
			resolve(val);
		}else{
			reject("error");
		}
	})
}



asynchronousFun("num01") 
.then( res => {
	console.info("第一次回撥函式執行");
	return asynchronousFun( res+"::num02");
})
.then( res => {
	console.info("第二次回撥函式執行");
	console.log("就到這裡吧");
	// 這裡什麼都不返回
})
.then( res => {
	console.info("第三次回撥函式執行");
	console.info("res是:"+res);
})
.catch( res => {
	console.error("發生錯誤::",res);
})

在這裡插入圖片描述