javascript : promise實現異步循環


需求場景大概就是:調用的方法是異步的。需要遍歷參數,循環調用這個方法。拿到所有方法執行的結果,才能進行下一步。

所以說,需要在循環里面執行異步方法,然后正確拿到所有結果。

剛面臨這個問題的時候我是拒絕的,對於我這個還沒出新手村的菜鳥來說,異步,還循環,離譜,總不能callback一層一層套進去吧。

然后我想到了遞歸,但是有風險,遞歸不好處理異常,掛一個倒一片。

最終選擇的處理方式是:promise和promise.all()。

promise 簡單示例:
var promise = new Promise(function(resolve, reject) {
	// resolve()在方法執行完成時調用,告訴程序方法執行完了
	// reject()在方法執行異常時調用,告訴程序方法掛了
	...此處是一個異步方法
	if(異步方法執行成功){
		// 可以傳參
		resolve(successData);
	}else if(異步方法執行失敗){
		// 可以傳參
		reject(failedData);
	}
});

promise.then(function(data){
	// 進入這個方法,意味着promise里面的方法執行完成,
	// promise的狀態變成fulfilled或者rejected
	// data 就是resolve()或者reject傳過來的參數
	console.log("異步方法執行完成...");
})

promise簡單粗陋地解釋,它就是一個對象,它的一生有三種狀態:pending(進行中),fulfilled(執行成功),rejected(執行失敗),並且三種狀態互斥。

promise從誕生伊始處於Pending狀態,調用resolve()方法可以使其變成fulfilled狀態,調用reject()方法可以使其變成rejected狀態。

fulfilled狀態和rejected狀態都能觸發then()方法。

再通俗點說就是,在promise對象里寫一段異步執行的代碼,當這段代碼執行完畢的時候,調用resolve()方法,調用resolve()方法,調用resolve()方法,那么就能觸發then()方法。

then()方法是可以鏈式寫下去的,但是需要在上一個then()方法里返回一個新的promise對象。

現在進入正題,怎么循環異步

核心方法就是:創造一個promise數組promiseArray,然后調用Promise.all(promiseArray).then(function(data){});

Promise.all會在整個promise數組里的promise執行完成以后,調用then()方法,並且返回所有promise的參數。

例子:

var promiseArray = [];
for(var i = 0;i<10;i++){
	promiseArray.push(new Promise(function(resolve,reject){
		console.log("創建了一個promise");
		...//一段異步代碼
		if(異步執行成功){
			// 改變promise的狀態,告訴程序這個promsie執行完成並執行成功了
			resolve(data);
		}else if(異步執行失敗){
			// 改變promise的狀態,告訴程序這個promsie執行失敗了
			reject(data);
		}
	}));
}
Promise.all(promiseArray).then(data){
	console.log("所有promise執行完成");
	// 並且所有執行的結果都在data里面了,處理它們吧
}

promise 異步循環,能用,好用,感恩的心,感謝promise.

記得調resolve()方法哦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM