【问题标题】:Join http results [closed]加入http结果[关闭]
【发布时间】:2019-10-03 22:34:51
【问题描述】:

我需要加入这两个http请求的结果:

this.http.get("https://jsonplaceholder.typicode.com/todos"); this.http.get("https://jsonplaceholder.typicode.com/users");

在他的专栏todo.userId = user.id

实现这一点的最佳方法是什么?

我正在使用角度 7

我知道这个问题在很多地方都问过,但我没有找到适合我需要的问题。

【问题讨论】:

    标签: javascript angular http angular7


    【解决方案1】:

    假设您确实试图通过用户 ID 将所有待办事项与其用户连接起来,Array.map 将完成这项工作。

    获得两个数据集后,只需使用Array.map 循环遍历所有用户并获取他们的待办事项

    // This function is just to fake the `this.http.get`
    function httpGet(url) {
      return new Promise( async (resolve, reject) => {
        const result = await fetch(url);
        const data = await result.json();
        resolve(data);
      });
    }
    
    // Create an array of promises to resolve your endpoints at once
    
    const promises = [
      httpGet('https://jsonplaceholder.typicode.com/todos'),
      httpGet('https://jsonplaceholder.typicode.com/users')
    ];
    
    // Wait for both promises to finish, then use Array.map to 'join' them
    Promise.all(promises).then( results => {
      const todos = results[0];
      const users = results[1];
    
    
      // This is the notable part
      const result = users.map( u => {
        u.todos = todos.filter( t => t.userId === u.id );
        return u;
      });
      // End of notable part
    
      console.log(result);
    });

    【讨论】:

    • 我没有对你投反对票,但我注意到对极其懒惰的问题的答案倾向于 -1 可能是为了鼓励提问者付出一些努力?也就是说,为实际答案 +1。
    • 非常感谢@mwilson!这正是我正在寻找的!
    • 我认为@msanford 可能是正确的;您因选择回答某些人可能认为措辞不佳的问题而被否决。那就是说...有一个赞成票。
    【解决方案2】:

    你可以使用rxJs方法forkJoin

    forkJoin(
       this.http.get("https://jsonplaceholder.typicode.com/todos"),
       this.http.get("https://jsonplaceholder.typicode.com/users")
    )
    .subscribe(result => { 
       // make your stuff here.
       console.log(result)
     });
    

    你也可以作为对象传递

    forkJoin({
       todos: this.http.get("https://jsonplaceholder.typicode.com/todos"); 
       users: this.http.get("https://jsonplaceholder.typicode.com/users");
    })
    .subscribe(result => { 
       // make your stuff here.
       const allObjects = {
          result.todos,
          result.users
       }
     });
    

    【讨论】:

    • 这两个结果只能手动加入?没有函数吗?比如 combineLatest、map、merge 或类似的东西?
    • 这不是加入任何东西。所有这一切都是将两个响应放入一个对象中(类似于Promise.all 之类的功能)。我认为 OP 想要将两个数据集合并/连接为一个。
    • “正确”答案是相同的,但映射result.todosresult.users。我知道困难会出现,但你必须有思考的能力
    • 我看不出正确答案和这个答案是如何相同的。问题是如何将两个数据集合并为一个。你根本没有解决这个问题。我想你误解了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2018-01-06
    • 2011-11-21
    • 2019-02-22
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    相关资源
    最近更新 更多