如何在路由之前等待订阅事件完成

时间:2020-04-09 01:01:49

标签: angular http post routing rxjs

我目前正在执行POST方法,并使用一些参数路由我的应用程序,但是问题似乎是应用程序在POST方法完成之前路由并带有响应。

我的功能:

class MyWindow: UIWindow {

    override func sendEvent(_ event: UIEvent) {
        let touches = event.allTouches!.filter { $0.phase == .moved }

        if touches.isEmpty {
            super.sendEvent(event)
            return
        }

        let touch = touches.first!
        let vc = self.rootViewController as! ViewController

        // Use the touch to determine which view to put on top,
        // then call super.

        let loc_before = touch.previousLocation(in: vc.view)
        let loc_now = touch.location(in: vc.view)
        let delta = CGPoint(x: loc_now.x - loc_before.x, y: loc_now.y - loc_before.y)

        /*
         Q1    |    Q2
               |
         ------|------
               |
         Q3    |    Q4
         */

        let q1 = delta.x < 0 && delta.y < 0
        let q4 = delta.x > 0 && delta.y > 0

        let q2 = delta.x > 0 && delta.y < 0
        let q3 = delta.x < 0 && delta.y > 0

        if q1 || q4 {
            // Picker 1 should scroll
            vc.view.bringSubviewToFront(vc.picker1)
        }

        if q2 || q3 {
            // Picker 2 should scroll
            vc.view.bringSubviewToFront(vc.picker2)
        }
        super.sendEvent(event)
    }
}

发生的问题是,它转到POST响应之前返回“ responseBody”的路径

在路由用户之前,我如何使其等待响应返回?

3 个答案:

答案 0 :(得分:1)

您在这里遇到了几个问题。

let responseBody;

let postUploads = function() {
  return this.http.post(url, uploadFile).pipe((response: any) => this.responseBody = response);
}

在此代码中,因为您正在使用function() { }语法声明一个函数,所以this将引用该函数本身。 this.http是不确定的。

此外,您似乎正在尝试使用表达式responseBody设置局部变量this.responseBody = response

这也是pipe的错误使用。 Pipe接受RxJS运算符,例如maptap等。它不接受这样的回调。

this.router(['/inbox], { queryParams: {file: responseBody} })

在此代码中,您未正确调用路由器。我怀疑你是说this.router.navigate(['/inbox], { queryParams: {file: responseBody} });

固定版本

您的代码可以简化为以下内容:

this.http.post(url, uploadFile).subscribe((response: any) => {
  this.router.navigate(['/inbox'], { queryParams: {file: response } });
});

此订阅可观察对象并在收到响应时执行导航。我不知道response是什么数据类型,但是如果它是某种Blob,则您可能不想将其放在url中。

答案 1 :(得分:0)

您引用的是错误的responseBody

尝试以下方法:

  this.http.post(url, uploadFile)
    .subscribe(responseBody => this.router(['/inbox'], { queryParams: { file: responseBody } }))

这个想法是让可观察的输出(例如http.post())流过可观察的链。

答案 2 :(得分:0)

我认为这里不需要局部变量responseBody。您可以直接在subscription方法中获取responseBody的引用。我已删除了不必要的代码,请检查并告诉我是否可行。

    let postUploads = function() {
      return this.http.post(url, uploadFile);
    }

    postUploads().subscribe((responseBody) => this.router(['/inbox], { queryParams: {file: responseBody} }));