0

"async: false"已从 chrome 浏览器中删除。

因此,当页面关闭时,我无法再从我的站点中删除用户。无论如何,我已经尝试使用 observable 但它似乎没有调用我的 API 并且系统关闭。

你也不能使用:

this.bookOutService.DeletebookOuts().subscribe(()=>{return true;}); 

因为这是一个Observable<boolean> | boolean.

@HostListener('window:beforeunload')
  canDeactivate(): Observable<boolean> | boolean {

$.ajax({
      type: 'DELETE',
      async: false,
      url: '/api/bookoutAPI/DeleteBookOuts',
    });

    return true;

    //return new Observable<boolean>((observer) => {
    //  debugger;
    //  this.bookOutService.DeletebookOuts().map(() => {
    //    observer.next(true);
    //    observer.complete();
    //  }).take(1);
    //});
  }
4

1 回答 1

0

编程中的一个普遍问题是当您等待其他事情发生时要做什么。这在 javascript 中经常发生,无论是用户输入还是从外部 API 请求事物。Javascript 通过具有某些异步的东西来解决这个问题。没有太多理由强制某些事情同步(换句话说,在继续之前等待某些事情完成)。这在 javascript 领域尤其如此,就好像您正在强制线程等待 xhr 的完成,您的 UI 可能会锁定等。

我建议使这个函数异步是最好的主意。

我不确定 jQuery ajax API 但删除 async false 可能就足够了。还有一些其他的问题。

可观察的:

RXJS 不同于回调或承诺的“正常”javascript 异步模式。使用 Observables,您可以定义一组操作。然后,当您订阅它时,它会执行这些操作。这是过于简单化了。有关更多详细信息,我建议https://www.learnrxjs.io/concepts/rxjs-primer.html和整个网站。我更喜欢它而不是文档本身。所以在你的例子中,你只是定义了一组要发生的事情,你没有订阅 observable,因此实际上什么都没有发生。

主机监听器:

HostListener 是target.addEventListener(eventType, callback). 在您的情况下,目标是窗口,eventType 是“beforeunload”,回调是在您的 API 上调用“/api/bookoutAPI/DeleteBookOuts”的东西。它不需要的是任何返回值。它也可以像您希望的那样异步。由于 HostListeners 不关心返回值,我建议您删除它的打字稿定义(即删除 canDeactivate() 和 { 之间的所有内容。如果您更喜欢始终指定返回类型,则可以使用 void。

2个可能的解决方案:

@HostListener('window:beforeunload')
canDeactivate() {
  $.ajax({
    type: 'DELETE',
    url: '/api/bookoutAPI/DeleteBookOuts',
  });
}

或者

@HostListener('window:beforeunload')
canDeactivate() {
  this.bookOutService.DeletebookOuts().pipe(take(1)).subscribe(
    () => console.log('Success'), //Handle Success
    error => console.log(error) //Handle Error
  );
}

需要注意的是从两者中删除返回类型。第一个异步消失了,第二个是 subscribe() (我还使用了较新的管道运算符,而不是方法链接)。

还值得注意的是,根据 DeletebookOuts 的实现,您可能不需要 take(1),我假设它被用来避免手动取消订阅。尽管请参阅是否有必要取消订阅由 Http 方法创建的可观察对象?有关这方面的更多信息,或者谷歌 rxjs 内存泄漏。

于 2019-04-15T14:14:02.257 回答