【问题标题】:How can I know when a callback is executed我怎么知道回调何时执行
【发布时间】:2019-06-11 22:54:00
【问题描述】:

所以,如果可能的话,我真正想知道的是,我如何知道回调何时执行,或者我如何从中触发和事件,或者我如何使用回调在执行时发送值,在 Angular 中使用 TypeScript。

我知道回调是如何工作的,并且由于它们的异步性质,这可能是不可能的,但我希望也许有一个我还没有找到的解决方法。我有这样的功能:

abcCallback() {
  // code
}

当我执行特定操作时执行(此操作与此问题无关,因为我使用的是库并且上下文不同)。问题是我不能在函数内部使用变量或可观察对象来发送事件,或者更改变量的值以了解函数是否已执行。

我可以知道回调是否执行的唯一方法是从函数内部打印消息,但我希望能够从函数外部知道回调是否已执行。

很抱歉,如果我不够清楚,请随时提出任何其他问题。

【问题讨论】:

标签: angular typescript asynchronous callback


【解决方案1】:

您可以在方法执行的返回语句之前添加一些私有标志,例如

abcCallback() {
  // code 
  abcCallback.__executed__ =  true;
}

然后你可以通过检查abcCallback.__executed__来获取执行状态。还记得在您想重新开始此过程时重置此标志。

【讨论】:

  • 嗯,这听起来很有趣。但是我可以在另一个组件中进行此检查吗?
  • @CristianCoroian,你可以随心所欲。它只是功能上的一个标志。
【解决方案2】:

您可以在回调之外定义一个变量,并在回调函数结束时更改它。该变量的状态将显示回调是否完成。

let isCallbackExecuted = false;
let abcCallback = () => {
  // do something
  isCallbackExecuted = true;
};
Promise.resolve().then(abcCallback);
// isCallbackExecuted is true if callback is finished

【讨论】:

  • 这件事是不可能的,就像我上面说的。回调是异步的,并且“不知道”变量,因为他是“未定义的”。
【解决方案3】:

我建议你使用静态属性:

export class MyComponent implements OnInit {
  static flag = false;
[...]

在您的回调中:

abcCallback() {
  MyComponent.flag = true;
}

注意,如果你必须在 HTML 中使用这个属性,你必须实现一个 getter

【讨论】:

  • 但是可以将静态变量发送到另一个组件吗?
  • 在您的所有应用程序中,您可以导入和使用 MyComponent 并使用 MyComponent.flag
  • 我设法使用静态变量做到了这一点。非常感谢!
【解决方案4】:

RxJS 是 Angular 的一部分。
也许您可以在执行回调时使用它来发出 BehaviourSubject。
之后,您必须订阅“事件”。
RxJS 网站:https://rxjs-dev.firebaseapp.com/
RxJS 视觉解释:https://rxmarbles.com/

import {BehaviorSubject} from "rxjs";
// By default callback wasn't executed
const executedCallback$: BehaviorSubject<boolean> = new BehaviorSubject(false);
// Your callback
const myCallback = () => {
  // Each time the callback is executed, the boolean true is emit
  executedCallback$.next(true);
}
// You listen the event
const subscription = executedCallback$.subscribe(executed => {
    // When you subscribe to a Behaviour subject, 
    // you firstly received the actual value, 
    // so you can received the value false if your callback wasn't executed
    if (executed) {
        console.log('My callback was executed');
    }
});
// When you want to stop listening, don't forget to unsubscribe ...
subscription.unsubscribe();

【讨论】:

  • 正如我之前所说,我不能在回调中使用变量,只能使用静态变量。
  • 我的问题是你为什么不能?
  • 它们是未定义的。
  • 你能把你的一些代码留给你吗,听起来奇怪的变量是未定义的,但对象是……常量可以导出为对象export const myConst,函数也是……我想如果没有您的部分代码,我们将看不到其他一些东西......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多