【问题标题】:Angular BehaviorSubject not sending nextAngular BehaviorSubject 不发送下一个
【发布时间】:2018-08-28 15:36:24
【问题描述】:

我有一个行为主题的服务似乎没有在 next() 上发送。

我可以看到当我 console.log 响应时该方法被触发

errorSubject = new BehaviorSubject<any>(
    {
        exception: false,
        message: '',
        segNum: ''
    }
);
error = this.errorSubject.asObservable();

responseHandler(response) {
    let obj = {};
    if (response.success) {
        return response.payload;
    } else {
        obj = {
            exception: true,
            message: response.exception.message,
            segNum: response.exception.seqNum
        };
    }
    console.log(obj);
    this.errorSubject.next(obj);
}

然后当我像这样订阅它时:

error;
ngOnInit() {
    this.error = this.apiHandlerService.error.subscribe(obj => {
        console.log(obj);
        if (obj.exception) {
            this.openModal();
        }
    });
}

所以我调用的每个 API 都会通过此方法传递。如果没有返回异常,则发送有效负载,否则将异常发送到错误模式组件。

当我触发 else 条件时,它似乎正在发送 errorSubject 的初始值,而没有得到 next()

有什么想法吗?

在下面的答案之后,我尝试重新排列我的方法,使其最后返回。还是不行:

responseHandler(response) {
    let obj;
    if (!response.success) {
        obj = {
            exception: true,
            message: response.exception.message,
            segNum: response.exception.seqNum
        };
        console.log(response);
    } else {
        obj = response.payload;
    }
    this.errorSubject.next(obj);
    return obj;
}

【问题讨论】:

  • responseHandler 是从哪里调用的?

标签: javascript angular typescript rxjs behaviorsubject


【解决方案1】:

我根据提供的代码创建了 stackblitz:https://stackblitz.com/edit/angular4-3tvtrt?file=app%2Fapp.component.ts

这里我每 10 秒从组件调用一次responseHandler 方法,并手动传递response,每次将segNum 变量加一。看起来它更新正确(您可以在警报中看到更新的数据),所以BehaviorSubject 可以按预期工作。如果您的代码与提供的部分相似,我唯一能想到的是来自服务器的响应,因此您必须检查开发人员工具中的Network 选项卡并确保您确实得到了您的期望。

编辑 1

问题出在这部分:

if (response.success) {
  return response.payload; // <- HERE
} else {
  ...
}

当你return 任何东西时,函数执行会在该行停止,并且该函数的以下代码将不会被执行。所以在你的情况下,当你得到responsesuccess == true 时,函数执行在return response.payload 行停止,解释器没有到达this.errorSubject.next(obj) 行。

编辑 2

这是一个较新的版本:https://stackblitz.com/edit/angular4-3tvtrt?file=app%2Fapp.component.ts

在这里,我轮流调用带有 2 个不同参数的 responseHandler 方法,正如预期的那样,alert 工作正常,并向我们展示了更新后的 seqNum 属性。因此,当我们不想触发我们的 Behavior Subject 时,您可以在控制台中看到“EXCEPTION”,而当我们想要触发时,您可以看到“TRIGGER 'NEXT()'”。请将您的代码与我上次提供的示例进行比较,它现在应该可以正常工作了。但是您必须确保responseHandler 在必要时自行触发,因为其他逻辑看起来没问题。

【讨论】:

  • 是的,奇怪的是,在responseHandler 方法中,我在控制台记录obj,我已经针对返回错误的实际API 调用对此进行了测试。它会记录正确的响应。适当地。这个接缝在我点击下一个()的地方分解。它没有发送新对象。
  • @SandraWillford,是的,我看到了问题...我已经更新了答案,请检查我的答案的“EDIT”块
  • 我一定是看这个太久了,没看懂。所以我需要扭转我的条件。
  • 我明天会检查它,这是我所在时区的深夜。如果您提供 2 个响应示例(成功和失败),这将容易得多
  • 一个例子看起来像这样{"success":true,"payload":{"doublePitchPrevention":7},"exception":null}这将返回有效负载
猜你喜欢
  • 2020-03-15
  • 1970-01-01
  • 2018-02-20
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2021-04-01
相关资源
最近更新 更多