jquery如何循环get后将请求到的json合并

RT

api_domain = ***,
search = {
    artist: api_domain + 'search/musician',
    music: api_domain + 'search/music',
    playlist: api_domain + 'search/playlist',
  }
function search(keyword) {
  for (i in search) {
    $.get(search[i], {
      'keyword': keyword,
      'page': 1,
      'page_count': 20,
    },function(data){
      console.log(data);
    })
  }
}

现在的问题是如何把三个返回的结果合并在一起,结构为

{
    artist: data1,
    music: data2,
    playlist: data3
}
阅读 6.6k
5 个回答

结合楼上所说的我写实现了出来,但是不太满意,应为需要罗列出来( ̄▽ ̄)
谁能给我一个更好的方法

api_domain = ***,
search = {
    artist: api_domain + 'search/musician',
    music: api_domain + 'search/music',
    playlist: api_domain + 'search/playlist',
  }

function search(keyword) {
  $.when(
    $.get(api.search.music, {
      'keyword': keyword,
      'page': 1,
      'page_count': 20,
    }),
    $.get(api.search.artist, {
      'keyword': keyword,
      'page': 1,
      'page_count': 20,
    }),
    $.get(api.search.playlist, {
      'keyword': keyword,
      'page': 1,
      'page_count': 20,
    })
  ).done(function(music, artist, playlist) {
    var data = new Object
    $.extend(true, data, music[0], artist[0], playlist[0]);
    console.log(data);
  })
}

更新:
@杨川宝 @_我已经从中二毕业了 的帮助下实现了我的需求,附完整代码

var api_domain = * * * ,
  api = {
    search: {
      artist: api_domain + 'search/musician',
      music: api_domain + 'search/music',
      playlist: api_domain + 'search/playlist',
    },
  }
  
function search(keyword) {
  var n = 0,
      result = $.map(api.search, function(url, type) {
        n++
        return [type, $.get(url, {
          'keyword': keyword,
          'page': 1,
          'page_count': 20,
        })]
      })
    $.when.apply(null, result).done(function() {
      for (var data = {}, i = 0; i < n; i++) data[arguments[i * 2]] = arguments[i * 2 + 1][0]
      console.log(data)
    })
  }
}

使用$.when()jQuery.when()

伪代码:

var api_domain = ***;
var artist = $.get(api_domain + 'search/musician');
var music = $.get(api_domain + 'search/music');
var playlist = $.get(api_domain + 'search/playlist');

$.when(artist, music, playlist)
    .done(artist, music, playlist) {
        // 以上异步都返回正确结果才执行这里的函数
        // 参数按照前面的顺序依次返回的结果
    };

补充说明,你可以把所有的异步代码放到一个数组里面,然后利用.apply()第二个参数来传入那个数组。

伪代码:

var arr = [$.get('...'), $.get('...'), $.get('...'), ...];

$.when.apply(null, arr).done(...);

得用promise-

用promise对象呀,然后把三个promise合并就可以

1.是不是可以把返回的数据,放进数组中,最后在用for in 把值放进去;
2.把async设为false 让他同步,这样就直接search[p] = data;
没有尝试过,不知道对不对。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题