пытаясь обернуть обещание заметным - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь вернуть наблюдаемое, когда обещание срабатывает.я использую ng-bootstrap, чтобы открыть модал, и я хочу обработать обещание возврата через наблюдаемый.

import { Injectable } from '@angular/core';
//modal/popups
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
// observable
import { Observable  } from 'rxjs';
@Injectable({
  providedIn: 'root'
})
export class AdminModalService {

  constructor(public ngbModal:NgbModal) {


  }

    open(component:any):Observable<any>{
     const modalRef = this.ngbModal.open(component); //this will return a promise
      modalRef.result.then((result) => {
              console.log('result', result);
              this.myObservable(result);
            }, (reason) => {
              //handle modal dismiss
              console.log('reason', reason);
              this.myObservable(result);
            });

    }

     myObservable(data){
        return new Observable((observer) => {
              observer.next(data);
         observer.complete();
        })
     }

}

это компонент заголовка, из которого я вызываю наблюдаемое, а также где я подписываюсь на него

import { Component, OnInit } from '@angular/core';
// components
import { ModalComponent from'../../../../shared/components/modal/modal.component';
// services
import { AdminModalService } from '../../../../shared/services/modal-service/modal-service.service';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.scss']
})
export class HeaderComponent implements OnInit {

constructor(public adminModalService: AdminModalService) {};


  ngOnInit() {
  }

openModal(){

    this.adminModalService.open(ModalComponent).subscribe(
      (res: any[]) => {
        console.log('res', res);
      }
    );
  }

}

это ошибка, которую я получаю: ошибка TS2322: Тип 'Promise<void>' isневозможно присвоить типу 'Observable<any>'.

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

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вы можете сделать это немного проще с помощью встроенного оператора fromPromise.

import { fromPromise } from 'rxjs/observable';

export class AdminModalService {

  constructor(public ngbModal:NgbModal) {


  }

    open(component:any):Observable<any>{
     const modalRef = fromPromise(this.ngbModal.open(component));

      modalRef.subscribe(/*Do your thing!*/);

    }

}

Он делает именно то, что вы пытаетесь сделать, но уже заключен в метод создания.

ПРИМЕЧАНИЕ : в RxJS 6.0+ функциональность fromPromise включена в оператор создания from, поэтому, если вы на 6.0+, просто используйте Observable.from() иливместо этого импортируйте from.

0 голосов
/ 04 октября 2018

Вы допустили ошибку в методе открытия сервиса.Никогда не используйте обещание в наблюдаемом.Всегда конвертируйте свое обещание с помощью наблюдаемого.

open(component:any):Observable<any>{
     const modalRef = this.ngbModal.open(component); //this will return a promise
      return Observable.fromPromise(modalRef.result);
    }

В вашем компоненте используйте вот так:

openModal(){

    this.adminModalService.open(ModalComponent).mergeMap(result => {
      return this.adminModalService.myObservable(result);
    }).subscribe(
      (res: any[]) => {
        console.log('res', res);
      }
    );
  }
...