我知道,这是一个新手问题:
我创建了一个移动应用程序,从蓝牙串行设备读取信息馈送。
使用以下承诺检索数据:
myServiceClass.getRemoteValue(valueId).then(reply: number) {
...
}
我需要读取来自此提要的多个参数,并且必须等待上一次调用完成才能请求新值。
如果我运行:
let requiredValues = [1, 2, 3, 4, ..., n];
for (let i=0; i<requiredValues.length; i++) {
myServiceClass.getRemoteValue(valueId).then(reply: number) {
...
}
}
这样,请求将并行运行,但我需要它们一个接一个地按顺序运行。是否有任何解决方案可以以某种方式按顺序链接一系列承诺?
换句话说,只有在解决上一个承诺之后,我才需要运行第 n 个承诺。
非常感谢您的时间。
好吧,您可以使用递归方法来实现这一目标...请看一下这个 plunker(运行 plunker 时,请注意值正在控制台中打印(
我只是使用了一些虚假数据,但我想这足以给你一个整体的想法:
public start(): void {
this.getSeveralRemoteValues([1,2,3,4,5,6,7,8,9]);
}
private getSeveralRemoteValues(array): Promise<boolean> {
if(array && array.length) {
return this.getRemoteValueFromService(array[0]).then(() => {
array.shift(); // remove the first item of the array
this.getSeveralRemoteValues(array); // call the same method with the items left
})
} else {
this.logEnd();
}
}
private logEnd(): void {
alert('All promises are done!');
}
private getRemoteValueFromService(value: number): Promise<boolean> {
// this simulates the call to the service
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(`Promise: ${value}`);
resolve(true);
}, 1000);
});
}