【问题标题】:Angular 2 - Promise chaining - promise not getting calledAngular 2 - 承诺链 - 承诺不会被调用
【发布时间】:2019-06-21 15:21:08
【问题描述】:

我使用解析器并链接承诺,但我调用的服务也返回承诺,我不知道如何在链接中使用它

第二个函数的主体永远不会被调用

public resolve(route: ActivatedRouteSnapshot): Promise<boolean> 
{
    return this.translationsService.getTrads()
    .then(function(response:Response)
    {
        this.coreService.trads=response.json(); <<<< it gets to forkInnerZoneWithAngularBehavior function and code stops

这就是我的服务功能的实现方式

getTrads() {
    if (this.trads) {
        return new Promise((resolve, reject) => {
            resolve(this.trads);
        });
    } else {
        return this.http.get(.....).toPromise();
    }
}

我觉得我做错了,但老实说 rxjs 确实让事情变得复杂

谢谢

解决方案:我简化了代码,“this”未定义,所以我使用 =>

【问题讨论】:

  • 如果你不回来,你就打破了链条。喜欢:return resolve(this.translationsService.getTrads());
  • 如何使用public resolve(route)函数?对于您想要实现的目标,这看起来非常不必要的复杂。
  • 我使用 resolve 并返回第二个“then”
  • 你不需要将getTrads 包裹在一个promise 中——只需使用return this.translationsService.getTrads().then(...)。
  • 将 getTrads() 设为 promise 函数,然后在公共解析函数中使用 then catch 等待 then 中的数据并在 catch 块中获取错误

标签: angular resolver


【解决方案1】:

您的getTrads 函数返回一个可以解析为数组或HTTP 响应的promise。如果您希望它解析为所需的数组,则必须在 getTrads 函数中执行 response.json():

getTrads() {
    if (this.trads) {
        return Promise.resolve(this.trads);
    } else {
        return this.http.get(...).toPromise()
            .then(response => response.json());
    }
}

【讨论】:

  • 好的.. 但它没有解决任何问题,我再次进入 forkInnerZoneWithAngularBehavior 并且代码停止
  • 好的我找到了,这个又不见了,我用=>代替,谢谢你的帮助
【解决方案2】:

getTrads() 作为 Promise 函数

如果数据存在,则将数据发送到then 块以执行下一个功能,如果不存在,则将其发送到error 块。

getTrads(): Promise<any> {
  return new Promise((resolve, reject) => {
    if (this.trads) {
      resolve(this.trads);
    } else {
      reject();
    }
  });
}

resolve() 函数作为 Promise

等待 getTrads() 函数的数据并处理接收到的数据或错误

public resolve(route: ActivatedRouteSnapshot): Promise<boolean> {
  return new Promise((resolve, reject) => {
    this.translationsService
      .getTrads()
      .then(result => {
        // resolve here
        // if you want to check if result is empty, do it here as well
      })
      .catch(error => {
        // reject here
      });
  });
}

(您的问题不清楚您对 resolve() 函数的作用)

【讨论】:

  • 问题是代码在我使用繁体时停止,我更新了我的问题......而且服务的整个想法是获取繁体,除非它已经有了它,所以拒绝使这里没有意义
  • 好的我找到了,这个又不见了,我用=>代替,谢谢你的帮助
  • 您在不是 Promise 的函数上使用了 then 块,这就是您无法获得响应的原因
猜你喜欢
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2018-01-17
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多