gpt4 book ai didi

javascript - 为什么 RxJS subscribe 允许省略箭头函数和下面的方法参数?

转载 作者:行者123 更新时间:2023-12-01 15:19:45 26 4
gpt4 key购买 nike

最近我需要使用 RxJS。我试图设计一个错误处理流程,但我发现了一些奇怪的语法传递方法参数:

.subscribe(
x => {
},
console.warn // <- Why does this compile, and warn 'is not 7' in debug console?
);
链接到最小复制:
https://stackblitz.com/edit/rxjs-6-5-error-handle-no-arrow-issue
重现步骤:
  • 使用 RxJS 6.5
  • 创建一个函数返回 observable
  • 订阅可观察
  • 将参数传递给订阅
  • 只需使用 ,console.warn , 不像 ,error => { console.warn(error); }

  • 如果没有箭头函数,它仍然会将错误传递给 console.warn。为什么?
    代码:
    import { throwError, concat, of } from "rxjs";
    import { map } from "rxjs/operators";

    const result = concat(of(7), of(8));

    getData(result).subscribe(
    x => {
    console.log("typeof(x)", typeof(x));
    if (typeof(x) === 'string') {
    console.log("x Error", x);
    return;
    }
    console.log("no error", x);
    },
    console.warn // <- Why does this compile, and warn 'is not 7' in debug console?
    );

    // pretend service method
    function getData(result) {
    return result.pipe(
    map(data => {
    if (data !== 7) {
    throw "is not 7";
    }
    return data;
    })
    );
    }
    我试图谷歌一些关键字,js,rxjs, Angular ,省略箭头函数,参数丢失,......但我找不到这里使用的技术。
    谁能提供解释该机制的链接?
    以下两个问题相关但不解释行为,只说“等效”:

    The line

    map(this.extractTreeData)

    is the equivalent of

    map(tree => this.extractTreeData(tree))


    How to pass extra parameters to RxJS map operator
    Why is argument missing in chained Map operator

    最佳答案

    首先,您需要了解您实际传递给 .subscribe 的内容。功能。本质上它接受三个可选参数 next , errorcomplete .每一个都是在源 observable 发出相应通知时要执行的回调。
    所以当你使用箭头函数时,你定义了一个就地回调函数。

    sourceObservable.subscribe({
    next: (value) => { },
    error: (error) => { },
    complete: () => { }
    });
    相反,您可以单独定义函数并将其用作回调。
    onNext(value) {
    }

    onError(error) {
    }

    onComplete() {
    }

    sourceObservable.subscribe({
    next: this.onNext,
    error: this.onError,
    complete: this.onComplete
    });
    现在这就是你所看到的。但是您传递的不是用户定义的函数,而是内置的 console.warn()功能。反过来,通知中的值将作为参数传递给回调函数。所以你的错误值 is not 7作为参数发送到 console.warn()然后它的工作(即打印到控制台)。
    但是有一个问题。如果您希望使用 this 引用任何类成员变量回调中的关键字,它会抛出一个错误,说明变量未定义。那是因为 this指的是回调中函数的范围,而不是类。克服这个问题的一种方法是使用箭头函数(我们已经看到了)。或使用 bind() 函数绑定(bind) this的含义类的关键字。
    sourceObservable.subscribe({
    next: this.onNext.bind(this),
    error: this.onError.bind(this),
    complete: this.onComplete.bind(this)
    });
    因此,例如,如果您只希望有错误回调,您可以显式声明它并忽略其他回调。
    sourceObservable.subscribe({ error: console.warn });

    现在关于您的问题“为什么在函数调用中没有括号”,已讨论 herehere .参数需要对函数的引用,函数名称表示它们的引用。

    关于javascript - 为什么 RxJS subscribe 允许省略箭头函数和下面的方法参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63187528/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com