Axax的Rxjs序列调用取决于先前的结果和处理错误

时间:2018-04-19 11:05:58

标签: javascript ajax rxjs reactive-programming

你能帮助我将以下基于承诺的场景转换为rxjs流吗?

async function createItem(...) {

    let newData, metadata;
    try {
        newData = await ajax('.../createItem', ...)
    } catch (e) {
        throw new Error('Can not create item', e);
    }

    try {
        metadata = await ajax('.../createMetadata', newData.id, ...);
    } catch (e) {
        throw new Error('Item created but metadata not', newData, e);
    }
    return {newData, metadata}
}

当你有两个阶段的项目创建过程时,是否只是流程。 例如,您首先调用ajax来创建实际项目,您从响应中获取项目ID 然后你调用另一个ajax来设置新创建的项目的一些元数据。

成功后,您将返回新的元数据和新数据。保存实际项目(第一阶段)失败时,您会收到既未创建实际对象也未创建元数据的错误。 如果创建了实际对象但元数据无法保存,则会产生错误,即创建了实际对象但不包含元数据。

我正在尝试使用Observable.concat来实现它,但是我无法在第二次调用中访问第一个ajax调用的输出。 我也试过Observable.ajax(...)。mergeMap(Observable.ajax(...)).... 但后来我不知道应该在何处发现故障,以确定发生故障的阶段(1或2)。

当你有一系列事件(下一个需要输入前一个)并想要从所有ajax响应中产生完整结果,或者部分结果与第一个后续成功的响应相结合时,你通常如何解决问题ajax调用以及失败时阶段的错误消息?

1 个答案:

答案 0 :(得分:1)

我假设您正在使用带有pipable运算符的RxJS 5.5:

return ajax('.../createItem', ...)
  .pipe(
    catchError(e => {
      throw new Error('Can not create item', e);
    }),
    concatMap(newData => ajax('.../createMetadata', newData.id, ...)
      .pipe(
        map(metadata => ({ newData, metadata })),
        catchError(e => {
          throw new Error('Item created but metadata not', newData, e);
        }),
      )
    ),
  )