上次有朋友反饋封裝的Promise.all有問題,執行順序有問題,現在改進一下

MyGodAdmin發表於2020-12-02
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Promise</title>
	</head>
	<body>

		<script type="text/javascript">
			/**
			 * new Promise 接收一個function作為引數,
			 * function中有兩個回撥函式作為引數,
			 *   一個成功的回撥函式,一個是失敗的回撥函式
			 * **/
			var p3 = new Promise(function(resolve, reject) {
				setTimeout(() => {
					resolve('3秒鐘結束了')
				}, 3000)
			})
			var p5 = new Promise(function(resolve, reject) {
				setTimeout(() => {
					resolve('5秒鐘結束了')
				}, 5000)
			})
			var p2 = new Promise(function(resolve, reject) {
				setTimeout(() => {
					resolve('2秒鐘結束了')
				}, 2000)
			})
			p3.then(r => console.log(r))
			p5.then(r => console.log(r))
			p2.then(r => console.log(r))

			//Promise的鏈式呼叫 then中的回撥函式可以接收上一次then的返回值
			p2.then(r => {
				console.log(r)
				return 'aaa'
			}).then(c => console.log(c))


			//Promise.all  它是以陣列作為物件
			//  當陣列中的所有Promise都執行完畢之後才執行then
			//  返回的資料是每個Promise物件資料組成的陣列,結果是按照引數順序執行的
			// Promise.all([p2,p3,p5]).then(res=>console.log(res))
			function promiseAll(arr) {
				let newArr = []
				//for(let i=0;i<arr.length;i++){
				//	newArr.push(null)
				//}
				
				return new Promise((resolve,reject)=>{
					arr.forEach((item,index) => {
						newArr.push(null)
						item.then(r => {
							newArr[index] = r
							let flag = newArr.every(v=>v!=null)
							if(flag){
								resolve(newArr)
							}
						})
					})
				})
			}
			promiseAll([p2, p5, p3]).then(r=>console.log(r))
		</script>
	</body>
</html>

相關文章