一一完成后承诺请求
Promise request after finishing one by one
我已经使用 Promise.all()
来获取每个请求。
但是我收到服务器报错,因为我请求的数组数量超过了100,所以我在短时间内请求了太多的调用。
如何改进我的 Promise 代码以在完成第一个请求后调用下一个请求?
public getProfits(data) {
return Promise.all(
data.map((obj) => {
return this.getProfit(obj.symbol).then(rawData => {
obj.stat = rawData
return obj;
});
})
).then(data => {
this.data = this.dataService.ascArray(data, 'symbol')
})
}
我认为你可以利用 async/await
。
它可能不是您所需要的,但您可以对其进行微调。
了解 async/await
here。
public async getProfits(data) { // add async here
let responses = [];
for (let i = 0; i < data.length; i++) {
let response = await this.getProfit(data[i].symbol);
console.log(response);
responses.push(response);
}
this.data = this.dataService.ascArray(responses, 'symbol');
}
如果您的环境允许使用 async/await,最简单的解决方案可能是:
public async getProfits(data) {
for(const obj of data) {
obj.stat = await this.getProfit(obj.symbol);
}
this.data = this.dataService.ascArray(data, 'symbol');
}
否则您可能需要这样做:
public getProfits(data) {
let p = Promise.resolve();
for(const obj of data) {
p = p.then(() => {
return this.getProfit(obj.symbol).then(rawData => obj.stat = rawData);
});
}
p.then(() => {
this.data = this.dataService.ascArray(data, 'symbol');
});
}
我已经使用 Promise.all()
来获取每个请求。
但是我收到服务器报错,因为我请求的数组数量超过了100,所以我在短时间内请求了太多的调用。
如何改进我的 Promise 代码以在完成第一个请求后调用下一个请求?
public getProfits(data) {
return Promise.all(
data.map((obj) => {
return this.getProfit(obj.symbol).then(rawData => {
obj.stat = rawData
return obj;
});
})
).then(data => {
this.data = this.dataService.ascArray(data, 'symbol')
})
}
我认为你可以利用 async/await
。
它可能不是您所需要的,但您可以对其进行微调。
了解 async/await
here。
public async getProfits(data) { // add async here
let responses = [];
for (let i = 0; i < data.length; i++) {
let response = await this.getProfit(data[i].symbol);
console.log(response);
responses.push(response);
}
this.data = this.dataService.ascArray(responses, 'symbol');
}
如果您的环境允许使用 async/await,最简单的解决方案可能是:
public async getProfits(data) {
for(const obj of data) {
obj.stat = await this.getProfit(obj.symbol);
}
this.data = this.dataService.ascArray(data, 'symbol');
}
否则您可能需要这样做:
public getProfits(data) {
let p = Promise.resolve();
for(const obj of data) {
p = p.then(() => {
return this.getProfit(obj.symbol).then(rawData => obj.stat = rawData);
});
}
p.then(() => {
this.data = this.dataService.ascArray(data, 'symbol');
});
}