Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/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
Typescript 使用angular 5进行数据转换的多个http调用_Typescript_Http_Angular5_Rxjs5 - Fatal编程技术网

Typescript 使用angular 5进行数据转换的多个http调用

Typescript 使用angular 5进行数据转换的多个http调用,typescript,http,angular5,rxjs5,Typescript,Http,Angular5,Rxjs5,我在angular 5应用程序中进行了几个类似的http调用。我还需要应用类似的数据转换逻辑,并将结果添加到数组中,以便在页面上显示它 第二次呼叫不是强制性的,是有条件的 在http subscribe上,我执行数据转换并将其推送到一个数组中。我尝试使用array concat添加第二次调用的结果,但在页面上没有得到任何结果 最好的方法是什么 if(oneReq) { this.http.get(url).subscribe ((message: any[]) =>

我在angular 5应用程序中进行了几个类似的http调用。我还需要应用类似的数据转换逻辑,并将结果添加到数组中,以便在页面上显示它

第二次呼叫不是强制性的,是有条件的

在http subscribe上,我执行数据转换并将其推送到一个数组中。我尝试使用array concat添加第二次调用的结果,但在页面上没有得到任何结果

最好的方法是什么

if(oneReq) {
     this.http.get(url).subscribe ((message:       any[]) => {
     results.push({});
     }
   return results;

} else {
    forkJoin([this.http.get(url),        this.http.get(url)]) . subscribe ((message:    any[]) => {
     results.push({});
 }
  return results;
  }
使用

  • forkJoin
    进行所有调用并等待完成(相当于
    Promise.all
  • defaultIfEmpty
    用于条件第二次调用
  • 映射
    和用于连接这些值的扩展运算符
  • 再次映射
    以转换这些ITEAM

    Observable
        .forkJoin(this.first$, this.second$.defaultIfEmpty([]))
        .map(([current, added]) => [...current, ...added])
        .map(item => transform(item))
        .subscribe(array=>{
           //do something with array
        });
    

根据提供的代码,我可以看到以下几点:

  • 观测值是异步的
  • 您可以在条件块之后订阅
  • 异步的 从
    http.get
    返回的可观察对象不会立即发出。它首先等待http响应,然后执行
    subscribe
    中的代码。它也不会阻止执行。因此,当它等待响应时,它会继续运行并返回结果。当响应最终到达时,
    subscribe
    块运行

    这里有一个例子。我模拟了Angular的
    http。在这里获取
    ,因为将Angular包含在代码段中并不是那么简单:

    //Angular的'http.get'返回一个RxJS可观测值
    //当http响应通过时,哪个'emit'和'completed'
    //所以这模拟了“get”
    //使用在500毫秒后发射并完成的可观察对象
    consthttp={get:()=>Rx.Observable.of('messages').delay(500)}
    常量结果=[]
    常量url=''
    函数getMessages(){
    http.get(url).subscribe(消息=>{
    //该区块在500ms后运行
    结果:push({});
    log('C:',results)//[{}]
    })
    返回结果;//此代码不会等待500毫秒,它会立即运行
    }
    const returned=getMessages()
    console.log('A:',返回)//[]
    console.log('B:',results)//[]
    //日志将显示:
    //A:[]
    //B:[]
    //C:[{}]

    分享一些示例代码。您使用的是旧的
    Http
    ,还是新的
    HttpClient
    ?您使用的是
    承诺
    还是
    可观测
    。。。。目前我们还不知道。被否决。我正在使用新的HttpClientModule您正在使用什么更改检测策略?纯代码帖子往往会被标记为低质量并被删除。您能否对此添加一些注释,以便其他人能够理解这是如何解决问题的?因此,第二个请求取决于第一个响应的响应?不,它们是独立的。如果看到您编写的一些代码不起作用,这将非常有帮助。但在我离开工作之前,我忍不住再次尝试一个答案:P更新回答显示两个流之外的条件目前,我使用的是if条件-forkjoin of 2 calls/subscribe,而在else中仅使用http/subscribe。由于某种原因,我无法使用函数格式化响应-我不得不复制逻辑。