關於一個迴圈請求與迴圈計時器的問題

木公呢發表於2019-03-27

問題如下(別人來問的, 大體細節如下)

這是他的程式碼

getdb().then(function (dbList) {
	for (var k of dbList) {
		console.log('1');
		(function (i) {
			getList(i).then(function (result) {
				console.log('2')
			})
		})(k)
	}
})
複製程式碼

這個是個請求, 迴圈第一個請求的結果作為第二個請求的條件, 如果這麼寫

關於一個迴圈請求與迴圈計時器的問題

會出現id一致為最後一個

然後我想到一個經典的面試問題

for (var k of [1, 2, 3, 4, 5]) {
	setTimeout(function () {
		console.log(i)
	}, 0)
}
複製程式碼

for迴圈加非同步的問題, 當時的解決方案是通過閉包解決, 通過閉包儲存迴圈的值, 來完成輸出1,2,3,4,5 程式碼如下

for (var k of [1, 2, 3, 4, 5]) {
	(function (i) {
		setTimeout(function () {
			console.log(i)
		}, 0)
	})(k)
}
複製程式碼

然後想到這我決定用計時器實現非同步的方式去模擬他的請求

var arr = [1, 2, 3, 4, 5, 6]
setTimeout(function () {
	for (var i of arr) {
		(function (a) {
			console.log(a)
			setTimeout(function () {
				console.log(a, '2')
			}, 0)
		})(i)
	}
}, 0)
複製程式碼

但是通過這樣我並沒有得到他的結果, 此處開始出疑問了, 都是非同步, 相同的解決方案, 一個可以解決一個"不可以"(我也不知道為啥不可以, 所以想來問問),是ajax的非同步與計時器不同還是我的思路有問題, 當前是改用遞迴去解決的迴圈請求問題, 不知道大家對這個有什麼看法或者見解, 感謝各位的不吝賜教

相關文章