角度-从“ then”内部返回值

时间:2018-08-28 04:02:12

标签: javascript angular typescript promise

我在StackOverflow上查看了类似的问题,但没有一个与我的特定问题相符:

我在Angular 6服务中有一个TypeScript函数,在这样的另一个服务中调用了一个函数:

服务1:

myArray: Array<IMyInterface>

...

getArray(): Observable<IMyInterface[]> {

    this.myArray= this.service2.getAnArray(1);
    return Observable.of(this.myArray);
}

服务2

getAnArray(myEntityId): Array<IMyInterface> {
  const myArray2: IMyInterface[] = [];

  this.getConnection().then(connection => {
    connection.invoke('GetEntityById', myEntityId).then((someJson: any) => {
      someJson.forEach( x => myArray2.push(x));       
      return myArray2;
    })
  }); 
}

它给我Service2 A function whose declared type is neither 'void' nor 'any' must return a value.中的错误

解析后,我需要返回myArray2 connection.invoke('GetEntityById', myId),因为只有在解析后才填充数组,这就是为什么我尝试在{{1 }}。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

这可能/可能不适合您的需求,但是您可以从服务方法中返回Promise,例如:

getAnArray(myEntityId) {
  const myArray: IMyInterface[] = [];

  // Note the return here
  return this.getConnection().then(connection => {
    return connection.invoke('GetEntityById', myEntityId).then((someJson: any) => {
      someJson.forEach( x => myArray.push(x));       
      return myArray;
    })
  }); 
}

您的调用代码将如下所示

getAnArray(someId).then(function(theArray) {. . .});

答案 1 :(得分:1)

为此有点晚了。但是有人可能会发现这很有帮助。 您可以为此使用异步/等待。原因是每次“等待”发生时,它将保持线程直到工作完成。

 async getAnArray(myEntityId) {
    await this.getConnection();
    try {
      let result = await connection.invoke('GetEntityById', myEntityId).then((someJson: any) => {
      someJson.forEach(x => myArray.push(x));
      return myArray;
      })
   } catch (err) {
  console.log(err);
}

}

要获得结果(将返回承诺):

this.getAnArray(myEntityId).then((data) => {
  console.log('data' , data);
 
});