問題如下(別人來問的, 大體細節如下)
這是他的程式碼
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的非同步與計時器不同還是我的思路有問題, 當前是改用遞迴去解決的迴圈請求問題, 不知道大家對這個有什麼看法或者見解, 感謝各位的不吝賜教