关于一个循环请求与循环计时器的问题

417 阅读1分钟

问题如下(别人来问的, 大体细节如下)

这是他的代码

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的异步与计时器不同还是我的思路有问题, 当前是改用递归去解决的循环请求问题, 不知道大家对这个有什么看法或者见解, 感谢各位的不吝赐教