Javascript 角度不';t返回期望值
我对角度有点陌生。我试图在执行HTTP请求时检索状态代码。以下是我在服务中使用的代码:Javascript 角度不';t返回期望值,javascript,angular,typescript,http,angular7,Javascript,Angular,Typescript,Http,Angular7,我对角度有点陌生。我试图在执行HTTP请求时检索状态代码。以下是我在服务中使用的代码: checkIfSymbolExists() { return this.http.get(this.url, { observe: 'response' }) .subscribe(response => { return response.status; }); } 我在一个组件的方法中使用返回值,如下所示: onSubmit() { c
checkIfSymbolExists() {
return this.http.get(this.url, { observe: 'response' })
.subscribe(response => {
return response.status;
});
}
我在一个组件的方法中使用返回值,如下所示:
onSubmit() {
console.log(this.stocks.checkIfSymbolExists());
}
我希望返回一个数字,但我有一个对象:
Subscriber {closed: false, _parent: null, _parents: null, _subscriptions: Array(1), syncErrorValue: null, …}
closed: true
destination: SafeSubscriber {closed: true, _parent: null, _parents: null, _subscriptions: null, syncErrorValue: null, …}
isStopped: true
syncErrorThrowable: true
syncErrorThrown: false
syncErrorValue: null
_parent: null
_parentSubscription: null
_parents: null
_subscriptions: null
__proto__: Subscription
当我对它执行console.log操作时,我没有简单地返回response.status
,而是得到了预期的200个状态代码(一个数字,而不是一个对象)
你知道为什么返回
response.status
的值时行为不同吗?谢谢。你做得不对。以下是正确的方法:
首先,您从http返回一个映射响应。get
而不是subscribe
ing。因此,您需要使用.pipe(map(…)
而不是订阅
:
import { map } from 'rxjs/operators';
...
checkIfSymbolExists() {
return this.http.get(this.url, { observe: 'response' })
.pipe(
map(res => (res.status === 200))
);
}
然后从checkIfSymbolExists
返回可观测值,然后通过onSubmit
方法subscribe
:
onSubmit() {
this.stocks.checkIfSymbolExists()
.subscribe(res => console.log(res));
// This should print true if status is 200. false instead.
}
解释:
您的服务方法checkIfSymbolExists()的职责是为组件提供它想要的东西。因此,基本上您的组件不需要知道您的服务从何处获取这些数据。订阅由checkIfSymbolExists()
现在,checkIfSymbolExists()
方法得到响应,您还添加了一个选项来观察完整的响应map
只是一个Rxjs操作符,它将转换响应。在map
中,我们正在做的是检查res.status
,我们将得到它,因为我们有通过执行{observe:'response}
d来观察响应
现在map
将返回比较运算符==
返回的任何内容,如果状态为200
则返回true
,否则返回false
希望这能让你更好地理解。你做得不对。以下是正确的方法:
首先,您从http返回一个映射响应。get
而不是subscribe
ing。因此,您需要使用.pipe(map(…)
而不是订阅
:
import { map } from 'rxjs/operators';
...
checkIfSymbolExists() {
return this.http.get(this.url, { observe: 'response' })
.pipe(
map(res => (res.status === 200))
);
}
然后从checkIfSymbolExists
返回可观测值,然后通过onSubmit
方法subscribe
:
onSubmit() {
this.stocks.checkIfSymbolExists()
.subscribe(res => console.log(res));
// This should print true if status is 200. false instead.
}
解释:
您的服务方法checkIfSymbolExists()
的职责是为组件提供它想要的东西。因此,基本上您的组件不需要知道您的服务从何处获取这些数据。订阅由checkIfSymbolExists()
现在,checkIfSymbolExists()
方法得到响应,您还添加了一个选项来观察完整的响应map
只是一个Rxjs操作符,它将转换响应。在map
中,我们正在做的是检查res.status
,我们将得到它,因为我们有通过执行{observe:'response}
d来观察响应
现在map
将返回比较运算符==
返回的任何内容,如果状态为200
则返回true
,否则返回false
希望这能让您更好地理解。您的后端API代码是什么?您的后端API代码是什么?谢谢您的回答。如果我想检查服务方法内部的状态代码呢?像这样:response=>{if(response.status==200){return true;}否则{return false;}}(edit:sorry for the indentation)您的速度非常快。成功了!非常感谢你!我不确定所有这些方法都做了什么,但我可以看到我还有很多东西要学^^^@tomfl,我已经添加了解释。希望这能帮助你了解一些正在发生的事情。非常感谢。如果我错了,请告诉我,但是我们订阅组件(而不是服务)中的响应(?)的原因是因为响应是异步的,这意味着执行其余的代码,然后才发送响应(从服务器加载后),对吗?是的。你可以这么说。无论您在subscribe
块中写什么,只有在收到响应后才会调用map
服务。谢谢您的回答。如果我想检查服务方法内部的状态代码呢?像这样:response=>{if(response.status==200){return true;}否则{return false;}}(edit:sorry for the indentation)您的速度非常快。成功了!非常感谢你!我不确定所有这些方法都做了什么,但我可以看到我还有很多东西要学^^^@tomfl,我已经添加了解释。希望这能帮助你了解一些正在发生的事情。非常感谢。如果我错了,请告诉我,但是我们订阅组件(而不是服务)中的响应(?)的原因是因为响应是异步的,这意味着执行其余的代码,然后才发送响应(从服务器加载后),对吗?是的。你可以这么说。无论您在subscribe
块中写什么,只有在收到响应后,服务才会调用map
ped。