在实际调用Angular的HttpInterceptor之前调用另一个httpCall

时间:2017-12-15 14:41:42

标签: angular angular4-httpclient

我正在使用新的Angular HttpInterceptor的{​​{1}} api,现在已陷入困境。这是我的用例。

在我的应用程序中,如果任何服务进行http调用,我想在它之前进行另一个静默http调用,并希望在本地存储它的结果。一旦完成无声呼叫,那么我只会继续进行服务的http呼叫并返回其结果。

这就是我正在做的事情。 (使用HttpInterceptor)

HttpClientModule

现在,上面代码的问题是,它正在成功执行内部静默调用,但之后从不调用原始的api调用。所以服务一直在等待。

2 个答案:

答案 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