Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在angular 6中使用toPromise的正确方法_Javascript_Angular_Rxjs_Observable_Angular6 - Fatal编程技术网

Javascript 在angular 6中使用toPromise的正确方法

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)} 我不知道如何处理来提取数据

我试图从多个http请求中检索数据,并决定避免嵌套subscribe()。我只想用异步等待风格编写代码

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?