我目前正在执行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”的路径
在路由用户之前,我如何使其等待响应返回?
答案 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运算符,例如map
,tap
等。它不接受这样的回调。
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} }));