需求详情
一个数组,根据数组arr中的id,调接口拿到每一个的name,然后在回调函数中,用对应的id和name去获取更多详情,例如age,height。
第一版实现
for(var i = 0; i < arr.length; i++) {
let temp = arr[i];
// 接口请求,假设为this.get
this.get1(url1,temp).success(function(res) {
if(res.success) {
let name = res.name
this.get2(url2,temp,name).success(res){
// res
}
}
})
}
问题所在:
出现闭包问题了,后来我根据网上的闭包解决方式
好吧,我没有试成功,是我太笨辽。
第二版实现
我想到了一个办法,我在第一个接口调用的时候,将每一个返回的name 存入一个数组,然后再次循环数组去调第二个接口。
但是,普通的异步函数调用,name数组何时能够完成是个问题。
于是,我想到了Promise
实现方法如下:
let arr2 = []
for(var i = 0; i < arr.length; i++) {
let temp = arr[i];
arr2.push(new Promise(function(resolve,reject) {
this.get1(url1,temp).success(function(res) {
if(res.success) {
res.id = temp
resolve({id:temp,
name: res.name})
}
})
}))
}
Promise.all(arr2).then(res => {
for(let j = 0;j<res.length;j++) {
let temp = res[j]
this.get2(url2,temp.id,temp.name).success(function(res) {
if(res.success){
console.log(res)
}
})
}
})
照着上面的依葫芦画瓢就可以了,闭包的,哪位大神可以解决,麻烦指导一下。