Javascript Rxjs ajax调用的顺序取决于以前调用的结果和错误处理
你能帮我把以下基于承诺的场景转换成rxjs流吗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
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