问题描述
上下文: 一个包含缺少外部 ID 引用的对象的数组 > 调用 API 来检索消息 ID 信封,如果存在的话 > 另一个 API 调用来检索实际消息 + 元数据。
3 个问题:
-
是关于实施的。我选择使用 concatMap 运算符而不是嵌套 Observables(mergeMap 也可能?Switchmap?其他地图运算符?)。这里涉及 2 个异步请求,每个请求只有 1 个结果,因此没有数据流。需要根据1个固定数组顺序调用:allTodosWithoutExtId
-
我想按顺序发出异步请求,其中内部依赖于外部请求的输入。如果没有必要,不要返回和 Observable/value(返回 EMPTY?)。最终生成的 updatePayloadArray 需要在单独的功能(关注点分离)中进行处理。返回 Empty 是一种优雅的方式吗?
-
内部和外部的日志产生相同的输出,我希望看到与所讨论的 Observable 特定调用相关的日志输出。似乎是序列 > 中最后一个 Observable 调用的结果,或者至少能够在 map 函数中,在/与前者中处理最后一个 Observable 输出的结果。
我认为最重要的 - 主要 - 问题是关于实施。我想避免嵌套,因为这种结构应该能够嵌套更深 2 层,并且很容易超过这个非常简单的序列顺序,它必须具有这种灵活性。避免订阅嵌套、混乱,使其高效/可读/易于理解。较少/不易出错。
retrieveMissingCloudIdsToApp() {
const getMsg = (msgEnvelope: {}) => {
let msgEnv;
let id;
if (msgEnvelope['result']['messages'] && msgEnvelope['result']['messages'].length > 0) {
id = msgEnvelope['result']['messages'][0]['id'];
msgEnv = this.getMessageByCloudId(id);
}
// else
// external ID non retrievable > EMPTY
return id ? msgEnv : EMPTY;
};
const getMsgidEnvelope = (todo: TodoModel) =>
this.searchForIdRefInBodyText(todo._id).pipe(
concatMap(getMsg),map((obj) => {
// same logging result as outer log
console.log('inner',obj);
return obj;
})
);
// this.allTodosWithoutExtId >> an array with TodoModel objects
const retrievedExtIds = from(this.allTodosWithoutExtId).pipe(
concatMap(getMsgidEnvelope),map((obj) => {
// same logging result as inner log
console.log('outer',obj);
return obj;
})
);
const updatePayloadArray: TodoModel[] = [];
retrievedExtIds.subscribe({
next: (value) => updatePayloadArray.push(value),// do some processing based on the results in Array
complete: () => console.log('updatePayloadArray::complete',updatePayloadArray),});
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)