После получения ответа на вызов post api выдается ошибка = ›.pipe не является функцией

Я делаю вызов api и ожидаю от него ответа, который может быть передан на второй вызов api, но я получаю сообщение об ошибке

ОШИБКА TypeError: this.helperService.getPointIdbyTags (...) [0] .pipe не является функцией

в строке .pipe (switchMap ((resarray: any) => {

Код TS

someFunction(floor){
 floor.entities.forEach(element => {
       let desiredTempForZone;

       this.getCurrentValue(element.name).subscribe((des) => 
                      {
                         currentTempForZone = des
                       });
       console.log(currentTempForZone);
})
}

getCurrentValue(eleName){
    let roomObj = this.getRoomObj(eleName);
    let equipRef = roomObj.map(equip => equip.entities.filter(entity => entity.entities.length > 0)[0])[0];

    return this.helperService.getPointIdbyTags(this.buildings, ['current', 
             'temp'], equipRef.referenceIDs.room)[0]
              .pipe(switchMap((resarray:any)=>{
                   const res = resarray[0]
                   return  this.siteService.getHisPointData(res, 'current')
                       .pipe(
                           map(this.helperService.stripHaystackTypeMapping),
                       )
              }));
}

А потом я пытаюсь передать это

switchMap((resarray:any)=>{
               const res = resarray[0]
               return  this.siteService.getHisPointData(res, 'current')

person Enthu    schedule 30.09.2019    source источник
comment
Кажется, вам не хватает правильного символа после this.helperService.getPointIdbyTags (...) [0]   -  person GreyBeardedGeek    schedule 30.09.2019
comment
@GreyBeardedGeek, я не думаю, что если бы это было так, то это дало бы ошибку компиляции, но я запустил блок кода и получил ответ 1-го вызова api, я также дал ответ выше :)   -  person Enthu    schedule 30.09.2019
comment
вы должны скопировать / вставить свой код еще раз, потому что GreyBeardedGeek прав, вам определенно не хватает круглой скобки здесь ....   -  person mickdev    schedule 30.09.2019
comment
хорошо, конечно, сделаю   -  person Enthu    schedule 30.09.2019
comment
@mickdev, я обновил, дайте мне знать, если скобки снова отсутствуют   -  person Enthu    schedule 30.09.2019
comment
Ладно, так лучше. Проблема, похоже, в том, что вы вызываете pipe в массиве javascript. Вы можете использовать pipe только наблюдаемые объекты, попробуйте вместо этого: getCurrentValue(eleName){ //.. return this.helperService.getPointIdbyTags(this.buildings, ['current', 'temp'], equipRef.referenceIDs.room) .pipe(switchMap((resarray:any)=>{ //... })); }   -  person mickdev    schedule 30.09.2019
comment
@mickdev, но getPointIdbyTags возвращает мне массив длиной 1, и из него я хочу получить значение и передать его второму вызову api, так как я могу справиться с этим, если я удалю [0], тогда в редакторе появится ошибка, Свойство 'pipe' не существует для типа 'any []'   -  person Enthu    schedule 30.09.2019
comment
Вам не нужно использовать pipe с switchMap. switchMap используется для цепочки наблюдаемых, и вы, очевидно, получаете не наблюдаемое из getPointIdbyTags, а массив или строку. Так что просто передайте этот массив или строку в this.siteService.getHisPointData.   -  person frido    schedule 01.10.2019


Ответы (1)


Похоже, что getPointIdbyTags(buildingObj: any, zoneTags: any, roomRef: string = undefined) { ... } - простая функция, возвращающая массив. Таким образом, нет необходимости использовать операторы .pipe() и .switchMap, потому что RXJS используется для упрощения создания асинхронного кода или кода на основе обратного вызова.

Ваш код должен выглядеть так:

getCurrentValue(eleName){
    let roomObj = this.getRoomObj(eleName);
    let equipRef = roomObj.map(equip => equip.entities
        .filter(entity => entity.entities.length > 0)[0])[0];

    let res = this.helperService.getPointIdbyTags(this.buildings, ['current', 
             'temp'], equipRef.referenceIDs.room)[0];

    // If this method `getHisPointData()` really makes HTTP call
    // and if it returns observable than you can use `pipe` operator
    return  this.siteService.getHisPointData(res, 'current')
                       .pipe(
                           map(this.helperService.stripHaystackTypeMapping),
                       )
                       .subscribe(s => console.log(s));

}
person StepUp    schedule 01.10.2019
comment
@Enthu, пожалуйста. Покажите, пожалуйста, ваш код метода getHisPointData. :) - person StepUp; 01.10.2019
comment
он работает, спасибо за указание, один запрос, как будто я показываю эти значения в html путем интерполяции (в Angular), что-то вроде этого {{a | б | c |}}, но если в a, b или c нет значения, то я должен удалить именно этот | подпишите, что для этого можно сделать - person Enthu; 02.10.2019
comment
@Enthu попробуйте использовать тернарный оператор ?. Примерно так {{ a ? a : b ? b : c ? c : "empty" }}. Прочтите здесь о тернарном операторе. - person StepUp; 02.10.2019
comment
привет, предложение по этому поводу, пожалуйста, stackoverflow.com/questions/58223425/, спасибо - person Enthu; 04.10.2019