javascript - Typescript Observables http.post 和 http.get 处理问题

标签 javascript angular typescript rxjs

我正在从事一个项目,我正在使用 Angular( typescript )/Node 构建一个简单的前端来调用后端服务器来执行不同的任务。这些任务需要时间来执行,因此需要在后端服务器上排队。我按照以下教程解决了这个问题:https://github.com/realpython/flask-by-example一切似乎都很好。

现在我正在完成前端的工作,其中大部分代码已经使用 Angular 和 Rxjs 用 Typescript 编写。我正在尝试在 Typescript 中复制以下代码:

https://github.com/dimoreira/word-frequency/blob/master/static/main.js

此代码由两个函数组成,其中第一个函数“getModelSummary”(示例中的 getResults)通过以下方式调用 post 方法:

public getModelSummary(modelSummaryParameters: ModelSummaryParameters): Observable<ModelSummary> {

        return this.http.post(`${SERVER_URL}start`, modelSummaryParameters)
            .map(res => res.json())
            ;
    }

将作业放入队列并在后端服务器上为该函数分配一个作业 ID。第二个函数“listenModelSummary”,理想情况下应该在输入 jobId 的第一个函数之后立即执行,并在短时间内循环检查作业是否已完成:

public listenModelSummary(jobID: string) {

    return this.http.get(`${SERVER_URL}results/` + jobID).map(
        (res) => res.json()
    );
}

作业完成后,需要返回结果,这将更新前端。

我是 Typescript、Observables 和 rxjs 的新手,想问问正确的方法。我不想使用 javascript,但希望在我的前端代码堆栈中尽可能多地使用 Typescript。如何使用第一个函数调用第二个函数及其输出“jobID”,并让第二个函数通过间隔运行直到输出返回?

最佳答案

Observables 很棒,是 Angular 的 HttpClient 类返回的对象类型,但在我看来,有时处理它们比使用 promises 复杂得多。

是的,将 Observable 转换为 Promise 的额外操作对性能有轻微影响,但您会得到一个更简单的编程模型。

如果需要等待第一个函数完成,然后将返回值交给另一个函数,可以这样做:

async getModelSummary(modelSummaryParameters: ModelSummaryParameters): Promise<ModelSummary> {
  return this.http.post(`${SERVER_URL}start`, modelSummaryParameters).toPromise();
}

async doStuff(): Promise<void> {
  const modelSummary = await this.getModelSummary(params);

  // not sure if you need to assign this to your viewmodel,
  // what's returned, etc
  this.listenModelSummary(modelSummary)
}

如果你对使用 Observables 死心塌地,我会建议使用 concatMap 模式,它会是这样的:

doStuff(modelSummaryParameters: ModelSummaryParameters): Observable<ModelSummary> {
  return this.http
             .post(`${SERVER_URL}start`, modelSummaryParameters)
             .pipe(
               concatMap(modelSummary => <Observable<ModelSummary>> this.listenModelSummary(modelSummary))
             );
}

这是一篇关于 Observable 的不同映射解决方案的文章:https://blog.angularindepth.com/practical-rxjs-in-the-wild-requests-with-concatmap-vs-mergemap-vs-forkjoin-11e5b2efe293这可能会对您有所帮助。

关于javascript - Typescript Observables http.post 和 http.get 处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52939586/

相关文章:

json - 如何让 Angular 的 HttpClient 返回一个对象而不是字符串?

javascript - 如何在没有iframe的情况下在ionic div中加载外部url

javascript - if 语句不适用于计数器变量

javascript - 如何在ajax调用jquery数据选项中使用键/值对

javascript - 单选按钮所在的颜色单元格并被选中,但单击时未选中

javascript - 使用 Angular 5 中的服务在两个不相关的组件之间共享数据

TypeScript 与泛型类型的交集,并使用 Partial

javascript - 在 Joomla 1.5 中使用 json_encode 调用从 ajax 获取响应

javascript - Angular 2如何防止特定变量的数据绑定(bind)

javascript - 警告 : functions are not valid as a react child question. ..是因为我的容器吗?