Javascript 在angular 6中使用toPromise的正确方法
我试图从多个http请求中检索数据,并决定避免嵌套subscribe()。我只想用异步等待风格编写代码Javascript 在angular 6中使用toPromise的正确方法,javascript,angular,rxjs,observable,angular6,Javascript,Angular,Rxjs,Observable,Angular6,我试图从多个http请求中检索数据,并决定避免嵌套subscribe()。我只想用异步等待风格编写代码 const diagnostics = this.http.get(url, {params: params}).toPromise() console.log(diagnostics); 但我明白了: // ZoneAwarePromise {__zone_symbol__state: null, __zone_symbol__value: Array(0)} 我不知道如何处理来提取数据
const diagnostics = this.http.get(url, {params: params}).toPromise()
console.log(diagnostics);
但我明白了:
// ZoneAwarePromise {__zone_symbol__state: null, __zone_symbol__value: Array(0)}
我不知道如何处理来提取数据
有没有办法避免类似这样的回调
.then(res => {}).catch()
听起来你可能想看看这个,你可以整理一系列的承诺,基本上可以“等待”所有的承诺完成,然后再对价值采取行动
myPromiseArray.push(this.http.get(url,{params:params}).toPromise())
Promise.all(myPromiseArray).then(alltheValuesInAnArray=>{})
正如您所注意到的,.toPromise
方法的结果是Promise对象。为了使用async/await样式,首先需要使用async函数包装代码,方法是将async
关键字预先添加到函数中,然后使用await
关键字告诉代码等待异步操作。在您的情况下,它是http请求
async function run(){
try{
const diagnostics = await (this.http.get(url, {params: params}).toPromise());
// wait for asynchronous request
console.log(diagnostics);
} catch(err){
// request failed
console.error(err);
}
}
run();
为什么你想要回报承诺,为什么不被观察?有什么具体的原因吗?@AmitChigadani,有人可能会问为什么Observable会在Promise做得很好的时候出现。@trincot因为Observable比Promise更丰富,可以做更多的工作。默认情况下,所有http请求都返回一个可观察的
。。那我们为什么要把它变成承诺然后再回来呢,但是承诺可以从漂亮的async
/await
语法中受益。@sandum你是在寻找一个纯承诺式的答案吗?为什么要用promise把事情复杂化呢?所有的当在OP中只谈论一个承诺时?他提到了多个HTTP请求——否则他可以简单地删除toPromise()完全调用并使用我假设的值——这是不正确的,角度http.get实际上返回了一个我没有想到的可观测值。@JakeKalstad我认为这是一个非常好的解决方案。我们可以使用promises和Promide.all()来连接它们,而不是使用多个嵌套的订阅。有没有理由不创建一个observables数组并使用RxJS操作符forkJoin和订阅生成的observables?