我正在尝试建立一个发送请求的循环。
但是,在发送下一个请求之前,我想等待接收请求的答复。我该怎么办?
private start(): Promise<string> {
return new Promise((resolve, reject) => {
for (let j = 0, p = Promise.resolve(); j < count; j++) {
p = p.then(_ => new Promise<null>(res =>
setTimeout(() => {
if (j === (count - 1)) {
resolve();
} else {
this.http.get();
res();
}
}, 1000)
));
}
});
}
感谢您的帮助
答案 0 :(得分:1)
奇怪的是,当您已经在使用Angular时使用的是Promise(而不是observables)。
无论如何,当涉及到迭代承诺时,您可以使用Promise.all。我们将promise放入列表中,然后仅在执行for循环的所有迭代之后才解析promise。
const promisesList = [];
for (let j = 0; j < count; j++) {
promisesList.push(promise);
}
Promise.all(promises).then(res => {
// handle the rest here
})
如@robert所建议的,我将包括一个实现方法,该实现方法是如何使用observables / forkjoin解决上述问题。使用前,您需要从rxjs包中导入forkJoin
。
类似于Promises.all(),forkJoin()
等待for循环完成,然后返回可观察的值。
import { forkJoin } from 'rxjs';
.
.
.
start() {
const observablesList = [];
const sendRequest = this.someService.someRequest(); // observable
for (let j = 0; j < count; j++) {
observablesList.push(sendRequest);
}
forkJoin(observablesList).subscribe(res => {
console.log(res);
//handle the rest
});
}
答案 1 :(得分:1)
感谢大家的帮助, 最后,我根据@Capricorn响应写了这个
private start(): Promise<string> {
return new Promise((resolve, reject) => {
for (let j = 0, p = Promise.resolve(); j < 10; j++) {
p = p.then(() => new Promise<null>((res) => {
this.get().then(() => res());
}));
}
});
}
private get(): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => {
alert('hello');
resolve();
}, 3000);
});
}
答案 2 :(得分:0)
您可以尝试
async mainFunction () {
for(let i = 0; i < count; i++) {
await apiCallFunction();
// other code
}
}
apiCallFunction() {
return new Promise((resolve, reject) => {
this.http.get().subscribe(resp => {
resolve();
});
})
}