ionic2 / angular2

时间:2017-04-11 19:53:35

标签: javascript angular typescript ionic2 rxjs

我知道,这是一个新手问题:

我创建了一个移动应用程序,从蓝牙串行设备读取信息源。

以这种方式使用承诺检索数据:

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个承诺。

非常感谢你的时间。

1 个答案:

答案 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);
    });
  }