Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Rxjs ajax调用的顺序取决于以前调用的结果和错误处理_Javascript_Ajax_Rxjs_Reactive Programming - Fatal编程技术网

Javascript Rxjs ajax调用的顺序取决于以前调用的结果和错误处理

Javascript Rxjs ajax调用的顺序取决于以前调用的结果和错误处理,javascript,ajax,rxjs,reactive-programming,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

你能帮我把以下基于承诺的场景转换成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调用的响应以及失败时阶段的错误消息相结合?

我假设您正在使用RxJS 5.5和pipable运算符:

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);
        }),
      )
    ),
  )

我想您应该创建第一个流,作为
ajax(“…”)
看起来像一个承诺<代码>从“rxjs”导入{fromPromise};return fromPromise(ajax(“…”)…如果
ajax
返回承诺,那么是的,您需要使用
fromPromise
对我的案例使用管道是否至关重要?我不完全明白管道在这里解决了什么问题。没关系。如果您使用的是RxJS 5.5或更高版本,建议您使用
管道
,但您也可以使用旧式。contactMap的使用是关键吗?在询问之前,我几乎也这样做了,但使用了mergeMap