真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

node.js學(xué)習(xí)筆記之promise

這篇文章說(shuō)說(shuō)我對(duì)promise的理解。

盤(pán)山網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,盤(pán)山網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為盤(pán)山超過(guò)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的盤(pán)山做網(wǎng)站的公司定做!

promise在ES6之前就有的寫(xiě)法,在ES6中寫(xiě)入了語(yǔ)言標(biāo)準(zhǔn),于是就有了原生promise對(duì)象。

promise對(duì)象能更好的改善異步操作的回調(diào)地獄,把多層嵌套扁平化,看上去像同步執(zhí)行的代碼,更容易閱讀和理解。由于js語(yǔ)法的靈活多變,也導(dǎo)致了promise的寫(xiě)法多樣。

promise有三種狀態(tài)來(lái)表示當(dāng)前執(zhí)行的進(jìn)度,pending,resolve,reject。promise執(zhí)行后,默認(rèn)是pending狀態(tài),意思是正在執(zhí)行,promise有兩種狀態(tài)變化,并且是不可逆的,第一種就是從pending到resolve,從正在執(zhí)行到執(zhí)行成功,第二種是pending到reject,從執(zhí)行中到執(zhí)行失敗。

promise一旦開(kāi)始執(zhí)行,就不能停止,直到執(zhí)行結(jié)束。

如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯(cuò)誤,不會(huì)反應(yīng)到外部。

當(dāng)處于Pending狀態(tài)時(shí),無(wú)法得知目前進(jìn)展到哪一個(gè)階段(剛剛開(kāi)始還是即將完成)。

下面我就針對(duì)promise的常規(guī)用法,鏈?zhǔn)秸{(diào)用,all方法,race方法這四方面來(lái)說(shuō)說(shuō)我對(duì)promise的理解。

先說(shuō)常規(guī)用法:

let promise = new Promise(function (resolve,reject){
	let res = 1+2+3;
	if(res>1){
		resolve(res);
	}else{
		reject("err");
	}
});
//結(jié)果接收方式1
promise.then(function (res){
	console.log(res);
},function (err){
	console.log(err);
});
//結(jié)果接收方式2
promise.then(function (res){
	console.log(res);
}).catch(function (err){
	console.log(err);
});
//結(jié)果接收方式3
promise.then(function (res){
	console.log(res);
});
promise.catch(function (err){
	console.log(err);
});

常規(guī)用法就是聲明一個(gè)promise對(duì)象,寫(xiě)入邏輯,根據(jù)邏輯的返回結(jié)果確定是執(zhí)行成功還是執(zhí)行失敗,執(zhí)行成功就調(diào)用resolve方法,該方法接受一個(gè)參數(shù),可以把邏輯返回的結(jié)果傳到外面來(lái)使用。執(zhí)行失敗可以調(diào)用reject方法,該方法也可以傳數(shù)據(jù)到外部,一般是傳錯(cuò)誤信息。

在上面的代碼中我寫(xiě)了三種結(jié)果接收方式,先說(shuō)第一種:

//結(jié)果接收方式1
promise.then(function (res){
	console.log(res);
},function (err){
	console.log(err);
});

promise有then方法,可以傳兩個(gè)參數(shù),兩個(gè)參數(shù)都是function,用來(lái)接收數(shù)據(jù),第一個(gè)參數(shù)是接收邏輯執(zhí)行成功的返回值,第二個(gè)參數(shù)接收邏輯執(zhí)行失敗的返回值。當(dāng)然這種看上去也會(huì)有一些嵌套的感覺(jué),我一般是不用這種寫(xiě)法的。

//結(jié)果接收方式2
promise.then(function (res){
	console.log(res);
}).catch(function (err){
	console.log(err);
});

我的個(gè)人理解是promise提供了then方法,又提供了catch方法,就是為了分別接收不同的邏輯執(zhí)行結(jié)果的,then方法就是為了接收成功返回的結(jié)果,那相應(yīng)的,catch方法就是為了接收失敗返回的結(jié)果,node.js中鏈?zhǔn)秸{(diào)用很常見(jiàn),這種寫(xiě)法也是一種鏈?zhǔn)秸{(diào)用,我是比較喜歡這種用法的。

//結(jié)果接收方式3
promise.then(function (res){
	console.log(res);
});
promise.catch(function (err){
	console.log(err);
});

當(dāng)然,既然promise提供了then和catch兩個(gè)方法接收結(jié)果,自然也可以用方法3來(lái)接收邏輯返回的結(jié)果,有些童鞋喜歡看起來(lái)很明朗的代碼風(fēng)格,那就是這種了,這種只是比第二種方式多了(promise對(duì)象.)這么一點(diǎn)代碼。其實(shí)看起來(lái)是挺工整的。

下面再說(shuō)說(shuō)promise的鏈?zhǔn)秸{(diào)用:

假設(shè)一種情況:你在A文件里記錄的B文件的名字,在B文件里記錄的C的名字,又在C文件里記錄的D文件的名字,你現(xiàn)在知道A文件的名字,想得到D文件的內(nèi)容,該怎么來(lái)寫(xiě)呢?我會(huì)這樣寫(xiě):

new Promise(function(resolve,reject){
	let res1 = 1;//res1邏輯
	if(res1){
		console.log("res1",res1);
		resolve(res1);
	}else{
		reject('new Error1()');
	}
}).then(function (res){
	return new Promise(function (resolve,reject){
		let res2 = 2+res;//res2邏輯
		if(res2){
			console.log("res2",res2);
			resolve(res2);
		}else{
			reject("new Error2");
		}
	});
}).then(function (res){
	return new Promise(function (resolve,reject){
		let res3 = 3 + res;//res3邏輯
		if(res3){
			console.log("res3",res3);
			resolve(res3);
		}else{
			reject('new Error3');
		}
	});		
}).then(function (res){
			console.log("res",res);//res3結(jié)果
		}
);

先在res1邏輯中用A文件的名字讀取A文件的內(nèi)容,得到的結(jié)果resolve出去。在then中接收。

然后在res2邏輯中取得A文件內(nèi)容,解析出B文件名字,再讀取B文件內(nèi)容,resolve出去。在then中接收,一直到res3結(jié)果這里得到D文件的內(nèi)容,如果是用回調(diào)函數(shù)的話估計(jì)就要嵌套很多層了,而用promise,就能很直觀的看清代碼走勢(shì),是不是很簡(jiǎn)單,當(dāng)然這一段代碼我一直覺(jué)得應(yīng)該有更簡(jiǎn)潔的寫(xiě)法,但無(wú)奈本領(lǐng)不到家,只能寫(xiě)成這樣了,如果有大神看見(jiàn)的話,請(qǐng)賜教。

這一段就是promise的鏈?zhǔn)秸{(diào)用,寫(xiě)個(gè)簡(jiǎn)潔的就是

new Promise().then().then().then();

好吧,下面說(shuō)說(shuō)promise的all方法:

function test(value){
	let promise = new Promise(function (resolve,reject){
		value = value * 2;
		if(value){
			resolve(value);
		}else{
			reject("err"+value);
		}
	});
	return promise;
}

let promArr = [1,2,3,4,5,6,7,8,9,10].map(function (i){
	return test(i);
});
Promise.all(promArr).then(function (posts){
	console.log(posts);
}).catch(function (err){
	console.log(err); 
});

這里假設(shè)我需要執(zhí)行10個(gè)異步操作,并把他們的結(jié)果放到一個(gè)數(shù)組里同時(shí)傳給一個(gè)方法,那all方法就能派上用場(chǎng)了,在這里需要重點(diǎn)說(shuō)明一下:如果10個(gè)promise都是返回成功的話,也就是promise內(nèi)部邏輯都是調(diào)用了resolve(value)方法的話,promise.then才能接收到最終的10個(gè)promise的結(jié)果組成的數(shù)組,就是上面代碼中的posts,假如其中一個(gè)promise執(zhí)行失敗,那么,不好意思,你就只能在catch中收到這個(gè)失敗的promise返回的錯(cuò)誤信息了,是的,只能收到執(zhí)行失敗的promise返回的錯(cuò)誤信息,這就是all方法。大概可以理解成這樣:

let a = true && true && true && true;

當(dāng)所有的表達(dá)式都為true時(shí)a才能等于true,有一個(gè)表達(dá)式為false時(shí),a就不能等于true;

下面再說(shuō)一下race方法。這個(gè)方法有點(diǎn)奇特,舉個(gè)例子,一個(gè)孕婦懷了四胞胎,那誰(shuí)是老大呢,當(dāng)然是先出生的是老大了,而race方法最奇特的地方就在于我只想知道老大是誰(shuí),不管后面誰(shuí)是老二老三,或者說(shuō)race是一個(gè)非常狠心的父親,只想要老大這一個(gè)孩子,后面的小孩一個(gè)也不要,就算出生了也是扔在醫(yī)院不管不問(wèn)。看代碼:

function test(value){
	let promise = new Promise(function (resolve,reject){
		setTimeout(function (){
			resolve(value);
		},Math.random() * 10000);
	});
	return promise;
}

let promArr = [1,2,3,4,5,6,7,8,9,10].map(function (i){
	return test(i);
});
Promise.race(promArr).then(function (post){
	console.log('post',post);
}).catch(function (err){
	console.log('err',err); 
}).finally(function (){
	console.log('finally');
});

這個(gè)例子的意思是有10個(gè)promise,每個(gè)的邏輯都是延時(shí)一段時(shí)間,時(shí)間隨機(jī),誰(shuí)先執(zhí)行完誰(shuí)就先返回。

最后的結(jié)果是post只能得到一個(gè)值,但別的延時(shí)還沒(méi)執(zhí)行完之前,這段程序不會(huì)結(jié)束,那也就意味著其他9個(gè)promise仍然會(huì)執(zhí)行到底,但我們是獲取不到他們9個(gè)的結(jié)果的,只能得到第一個(gè)返回的promise的結(jié)果。

恩。就先暫時(shí)說(shuō)這么多吧,promise還有一個(gè)done方法和finally方法,done方法是放在then鏈最后,是用來(lái)捕獲中間發(fā)生的任何異常的,這個(gè)沒(méi)有試驗(yàn),finally據(jù)說(shuō)是不論then和catch執(zhí)行了哪一個(gè)都會(huì)執(zhí)行finally方法,但我試驗(yàn)了卻報(bào)錯(cuò)了,有興趣的同學(xué)可以研究一下。


分享名稱(chēng):node.js學(xué)習(xí)筆記之promise
轉(zhuǎn)載源于:http://weahome.cn/article/jsiohp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部