javascript - 可观察到的成功方法未触发

标签 javascript angular observable

你能告诉我为什么这个 () 成功方法没有触发吗?当我使用 forkjoin() 时,它运行良好。成功方法必须每次都触发,不是吗?希望它像 try-catch block 上的 final 方法。

注意:请同时查看内联评论。

.ts

 getAllBooksReadAndUnRead(id: number, loader?) {
        this.article.getAllBooksReadAndUnRead(id)
          .map((res: any) => res.json())
          .subscribe(res => {
               this.setAllData(res); //it comes to here
               this.loadingControllerService.dismissLoader(loader);//I have to put this here.Then no problem.But I think it is duplicate of work???
          }, 
          error => {this.loadingControllerService.dismissLoader(loader);},
          () => {this.loadingControllerService.dismissLoader(loader);}//not fire
       });
      }

API调用

 getAllBooksReadAndUnRead(bookId) {
        return this.apiSer.get(`${config.fromThisBook}?page=all&book[]=${bookId}`);
    }

通用方法:

get(api) {
        return new Observable(observer => {
            let header = new Headers();
            this.createHeader(header)
                .then(() => {
                    let options = new BaseRequestOptions();
                    options.withCredentials = true;
                    options.headers = header;
                    this.http.get(api, options)
                        .subscribe(response => {
                            observer.next(response);
                         }, (e) => {
                            observer.error(e);
                        });
                })
        })
    }

post()

post(url, params): Observable<any> {
        return new Observable(observer => {
            let header = new Headers();
            this.createHeader(header)
                .then(() => {
                    let options = new RequestOptions({ headers: header });
                    this.http.post(url, params, options)
                        .subscribe(response => {
                            observer.next(response);
                            observer.complete();
                        }, (e) => {
                            observer.error(e);
                        });
                })
        })
    }

最佳答案

问题是您永远不会在自定义生产者中触发完成。你需要这样的东西:

  get(api) {
    return new Observable(observer => {
      let header = new Headers();
      this.createHeader(header)
        .then(() => {
          let options = new BaseRequestOptions();
          options.withCredentials = true;
          options.headers = header;
          this.http.get(api, options).subscribe(
            response => observer.next(response),
            (e) => observer.error(e),
            () => observer.complete();  <-------------------------
          );
        })
    })
  }

另外我认为你不需要自定义制作人,试试这样:

  get(api) {
    return Observable.from(this.createHeader()).map((header) => {
      let options = new BaseRequestOptions();
      options.withCredentials = true;
      options.headers = header;
      return this.http.get(api, options);
    }).mergeAll();
  }

这是它的工作原理:

  • Observable.from(this.createHeader()) 返回一个 observable,一旦 promise 被 resolved 就会传递值
  • .map((header) => { 观察来自返回的 promise 的值并发出 HTTP 请求并以可观察的形式返回结果
  • mergeAll() - 由于之前的操作返回并可观察,我们需要将其展平

关于javascript - 可观察到的成功方法未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45157794/

相关文章:

javascript - 寻找兼容跨移动浏览器的方式来从内置麦克风进行录音吗?

javascript - 如何将一个数字分成 4 个偶数?

knockout.js - 在订阅同一可观察值时获取可观察值的前一个值

angular - 使用 foreach 循环和 Observable 链接多个调用

javascript - 动态选择表单中的值

javascript - 通过 DOM 操作插入 html 元素后访问该元素

angular - 如何访问组件中 FormArray 中定义的 HTML 中的控件 - Angular2

angular - 找不到模块 'ng2-translate' 我无法导入

json - Angular Json 管道类型错误 : Converting circular structure to JSON

Android登录屏幕: Two-way binding EditText and TextView