javascript - jquery如何循环get后将请求到的json合并
黄舟
黄舟 2017-04-10 16:36:57
[JavaScript讨论组]

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
}
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(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)
    })
  }
}
PHPz

使用$.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-

PHPz

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

阿神

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号