promise對象和async函數的使用

Promise 對象和async函數的使用

Promise 對象

Promise 是一個對象,用於解決異步編程的一個方案,從它可以獲取異步操作的消息。

then()方法的使用
then() 方法可接收兩個函數作爲參數,第一個參數是 Promise 執行成功後的回調,第二個參數則是 Promise 執行失敗後的回調,兩個函數中只會有一個被回調,當然它也可以用於鏈式的使用。

使用then()方法模擬圖片異步加載案例

function loandImage(src){
	/*創建promise對象,這個對象需要傳入一個函數,
		這個函數需要傳入兩個參數
	  	resolve返回執行成功的狀態,reject返回失敗狀態,
	  	在函數裏寫入需要執行的異步請求
	*/
	return new Promise(function(resolve,reject){
		//使用定時器模擬延遲
		// setTimeout(function(){
			let img = new Image();	//創建一個html img元素
			img.src = src;
			//設置圖片寬高,填充到div
			img.width = 400;
			img.height = 300;
			let imgdiv =  document.getElementById("imgdiv");
			imgdiv.appendChild(img);
			
			//如果該元素的onload事件觸發,說明元素正常被加載
			img.onload = function(){
				/*
					resolve會導致返回一個成功狀態的promise對象
					resolve的參數會傳給callback
				*/
				resolve(img);
				
			}
			img.onerror = function(){
				//返回一個rejected狀態的promise對象
				reject("加載圖片失敗:"+src);
			}
		},3000);
	});
}

/*調用loadImg函數,調用then()方法,方法中可以傳入一個function,
表示異步請求成功後執行,也可以傳入兩個,第二個表示異步請求失敗後執行
*/
let leg = loandImage('img/1.jpg')
.then(
	function(img){
		console.log("加載成功1");
		return loandImage('img/2.jpg');
	},function(msg){
		console.log(msg);
	}
)
.then(
	function(img){
		console.log("加載成功2");
		return loandImage('img/3.jpg');
	}
	,function(msg){
		console.log(msg);
	}
)
.then(
	function(){
		console.log("加載成功3");
	}
	,function(msg){
		console.log(msg);
	}
)

catch()方法
catch()方法是用於指定發生錯誤時的回調函數,其作用更then()方法第二個參數效果是一樣的,我就不做過多的介紹了。

async函數

  • async 是 ES7 纔有的與異步操作有關的關鍵字,和 Promise , Generator 有很大關聯的。但是現在目前主流的瀏覽器也大都支持了這套語法。
  • async 函數它是返回一個 Promise 對象,同樣的我們也可以使用 then()方法添加回調函數。

async函數的使用
我們只需要在函數前面加上async關鍵字即可。

async function firstAsync(){
    return "firstAsync";
}
console.log(firstAsync());

運行結果:

在這裏插入圖片描述

我們可以看到,這個函數所返回的對象正是Promise對象,所有說我們也同樣可以使用then()方法和catch()方法。

await的使用

await 操作符用於等待一個 Promise 對象, 它只能在異步函數 async function 函數內使用在其他函數中使用是用不了的。
案例:

function calculate(num){
	return new Promise(function(resolve,reject){
		//模擬延遲 
		setTimeout(function(){
			resolve(num * 2);
		},1000);
		
	});
}

async function calc() {
	let result1 = await calculate(2);
	let result2 = await calculate(result1);
	let result3 = await calculate(result2);
	console.log("計算結果是"+result3);
}
calc();

運行結果:
在這裏插入圖片描述
我們可以看到使用await後數據是正確的,接着再看看去掉await關鍵字後的效果
在這裏插入圖片描述
很明顯,這個異步的計算就出問題了。

以上就是promise對象和async函數的基本使用,感謝觀看

在這裏插入圖片描述

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