你能帮助我将以下基于承诺的场景转换为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调用以及失败时阶段的错误消息?
答案 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);
}),
)
),
)