如何使用异步数据流中的数据进行API调用(可观察)?

时间:2018-08-31 01:40:57

标签: angular angular2-observables

我正在编写一个Angular 2图书搜索应用程序,该应用程序通过服务与API交互。我有一个供用户将书上传到后端的数据库的表单,提交运行uploadBook后会运行:

uploadBook(){
    //collects form data and uses it to set the value of this.book

    this._uploadService.uploadBookToDb(this.book)
        .subscribe( res => {
            alert('book uploaded');
        })
  }

upload.service.ts中:

uploadBookToDb(book){
    return this._http.post(environment.apiUrl + '/book_new', JSON.stringify(book))
        .map(res => res.json());
    }

这可以正常工作,并且我可以像通常一样从服务器得到响应。但是,当我尝试按用户类型查找书籍时遇到麻烦:

bookTitle.valueChanges
        .debounceTime(1000)
        .map(bookTitle => this._uploadService.bookLookUp(bookTitle))
        .subscribe(res => update dropdown with results);

服务bookLookup中的服务类似于上面的工作uploadBookToDb

bookLookUp(title){
    return this._http.post(environment.apiUrl + '/book_lookup', JSON.stringify(title))
        .map(res => res.json());
  }

但是,当我在书名字段中键入内容时,将返回可观察的内容:Observable {_isScalar: false, source: Observable, operator: MapOperator}。服务器上没有记录任何活动,即服务中的API调用甚至根本没有执行。

我确定我将可观察对象错误地映射到服务,但是对于像valueChanges那样处理异步数据请求时如何正确执行此操作感到困惑。任何帮助弄清楚这一点的帮助都将受到欢迎。

1 个答案:

答案 0 :(得分:1)

您应该订阅bookLookUp(title) ..在某处返回的可观察对象。

不确定确切的版本,但是如果您使用的是5+版本,请使用HttpClient而不是完整的Http并删除.map(res => res.json());-不再需要。