我正在使用新的Angular HttpInterceptor
的{{1}} api,现在已陷入困境。这是我的用例。
在我的应用程序中,如果任何服务进行http调用,我想在它之前进行另一个静默http调用,并希望在本地存储它的结果。一旦完成无声呼叫,那么我只会继续进行服务的http呼叫并返回其结果。
这就是我正在做的事情。 (使用HttpInterceptor)
HttpClientModule
现在,上面代码的问题是,它正在成功执行内部静默调用,但之后从不调用原始的api调用。所以服务一直在等待。
答案 0 :(得分:6)
已更新:添加了一个有效的插件。 https://plnkr.co/edit/WFecj8fFZ6z4G6mpLSCr?p=preview
记下调用的顺序以及使用浏览器开发工具添加的标题。
另请注意,下面的解决方案是使用RxJS可调运算符而不是标准运算符(不应该有任何不同的行为......如果代码无法编译则添加此注释)
问题的原因是,在呼叫与case when ts.wgt_kg / ((hgt_cm / 100) * (hgt_cm / 100)) < 18.5 then 'Underweight < 18.5'
when ts.wgt_kg / ((hgt_cm / 100) * (hgt_cm / 100)) between 18.5 and 24.9 then 'Normal 18.5-24.9'
when ts.wgt_kg / ((hgt_cm / 100) * (hgt_cm / 100)) between 25.0 and 29.9 then 'Overweight 25-29.9'
when ts.wgt_kg / ((hgt_cm / 100) * (hgt_cm / 100)) > 30.0 then 'Obese > 30.0'
end as BMI
匹配的情况下,intercept
方法永远不会返回句柄。
将您的代码更新为类似于以下内容的
/api
请注意,intercept(req: HttpRequest<any>, next: HttpHandler):Observable<HttpEvent<any>> {
if (req.url.match(/api\//)) { // api call
return http.post('/auth/silentCall', {user: 123}).pipe(switchMap((response) => {
console.log('Service's call response');
let clone = req.clone({ setHeaders: { 'Authorization ': tokenService.getToken() } });
return next.handle(clone);
}), catchError((err) => {
if(err instanceof HttpErrorResponse) {
console.log('Your logging here...');
let clone = req.clone({ setHeaders: { 'Authorization ': tokenService.getToken() } });
return next.handle(clone);
}
return Observable.throw(err);
}));
} else {
return next.handle(req); // call original auth request.
}
}
的响应是平坦的,以返回http.post
方法返回的可观察序列,或者使用next.handle()
抛出已终止的observable。
另请注意,if条件已被删除,因为如果api调用失败,则调用catch块(或者在订阅时调用错误处理函数)
答案 1 :(得分:0)
您没有在 `
import UIKit
class ViewController: UIViewController, UITableViewDataSource , UITableViewDelegate {
@IBOutlet weak var table: UITableView!
var data:[String] = []
var file:String!
var text:String = ""
@IBOutlet weak var noteText: UITextView!
@IBAction func addNew(_ sender: UIButton) {
addnote()
}
// original code
override func viewDidLoad() {
super.viewDidLoad()
load()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
// Notes section code
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell")!
cell.textLabel?.text = data[indexPath.row]
return cell
}
func addnote(){
let name:String = "Row \(data.count + 1)"
data.insert(name, at: 0)
let indexpath:IndexPath = IndexPath(row: 0, section: 0)
table.insertRows(at: [indexpath], with: .automatic)
self.performSegue(withIdentifier: "noteDetail", sender: nil)
save()
}
// editing code button
override func setEditing(_ editing: Bool, animated: Bool){
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.performSegue(withIdentifier: "noteDetail", sender: nil)
}
func tableView( _ tableView: UITableView, commit editingStyle:UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { data.remove(at: indexPath.row)
table.deleteRows(at: [indexPath], with: .fade)
save()
}
func save (){
UserDefaults.standard.set(data, forKey: "notes")
UserDefaults.standard.synchronize()
}
func load() {
if let loadedData = UserDefaults.standard.value(forKey: "notes") as? [String] {
data = loadedData
//table.reloadData()
}
}
// Notes section code
// Seques to move from each section on Home page
@IBAction func remButton(_ sender: Any) {
performSegue(withIdentifier: "remSeque", sender: self)
}
@IBAction func noteButton(_ sender: Any) {
performSegue(withIdentifier: "noteSeque", sender: self)
}
@IBAction func reminderButton(_ sender: Any) {
performSegue(withIdentifier: "reminderSeque", sender: self)
}
@IBAction func mapsButton(_ sender: Any) {
performSegue(withIdentifier: "mapSeque", sender: self)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
内返回observable
。试试这个
if