我知道,这是一个新手问题:
我创建了一个移动应用程序,从蓝牙串行设备读取信息源。
以这种方式使用承诺检索数据:
myServiceClass.getRemoteValue(valueId).then(reply: number) {
...
}
我需要读取来自此Feed的多个参数,我必须在请求新值之前等待上一个调用完成。
如果我跑:
let requiredValues = [1, 2, 3, 4, ..., n];
for (let i=0; i<requiredValues.length; i++) {
myServiceClass.getRemoteValue(valueId).then(reply: number) {
...
}
}
这样请求将并行运行,但我需要它们一个接一个地运行序列。是否有任何解决方案后续链接一系列承诺?
换句话说,我需要在前一个承诺解决之后才运行第n个承诺。
非常感谢你的时间。
答案 0 :(得分:1)
好吧,您可以使用递归方法来实现这一目标...请查看this 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);
});
}