【问题标题】:Make the http request wait to return its response使 http 请求等待返回其响应
【发布时间】:2019-05-05 12:59:32
【问题描述】:

我有一个返回权限的 HTTP GET 请求。我在 isProjectLead() 的 auth.service.ts 中使用此请求。我需要等待 http 请求返回值以允许访问页面。

我该怎么做?我尝试使用 Promises,但我对此了解不多。

get isProjectLead() {

  var flag = false;
  //var thisPromiseCount = ++this.promiseCount;

  var user = JSON.parse(localStorage.getItem("user"));
  if (!this.selectedProject) {
    this.selectedProject = parseInt(this.route.snapshot.paramMap.get('id'));
  }

  this.linkService.getLinksByUserAndProject(user.username, this.selectedProject).subscribe(links => {
        this.links = links;

        this.links.forEach(element => {
          if (JSON.parse(element).role.id == "2") {
            flag = true;
          }
        });
      },
        (err: any) => {
        });


  return flag;
}

【问题讨论】:

  • 这段代码应该已经可以工作了。 'subscribe' 中的代码只应在getLinksByUserAndProject 返回数据时执行。为什么你认为没有?
  • 我知道,但我需要将标志返回为真。 http get 请求在返回后完成。我从来没有把标志设为真,所以访问总是被阻止。 @Kokodoko

标签: typescript promise angular5 httprequest guard


【解决方案1】:

将 observable 转换为 Promise

async isProjectLead() {

  var flag = false;
  //var thisPromiseCount = ++this.promiseCount;

  var user = JSON.parse(localStorage.getItem("user"));
  if (!this.selectedProject) {
    this.selectedProject = parseInt(this.route.snapshot.paramMap.get('id'));
  }

  try {
    var links = await this.linkService
      .getLinksByUserAndProject(user.username, this.selectedProject)
      .toPromise();
    this.links = links;

    this.links.forEach(element => {
      if (JSON.parse(element).role.id == "2") {
        flag = true;
      }
    });

  } catch (e) {
    // handle error
  }

  return flag;
}

要记住的要点

返回响应也将是一个承诺,因此您必须等待承诺解决。

【讨论】:

  • 非常感谢!!我的请求是返回 Observable (return this.http.get(url);)!我如何将其转换/写入承诺?
  • 我已更新答案以返回承诺。请在服务操作调用后查看.toPromise() 操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 2020-02-10
  • 2020-04-20
  • 1970-01-01
  • 2018-06-03
  • 2014-04-24
  • 1970-01-01
相关资源
最近更新 更多