jQuery自动完成嵌套Ajax调用

时间:2014-04-07 23:03:45

标签: javascript jquery jquery-ui jquery-ui-autocomplete spotify

我目前正致力于使用Spotify Metadata API实现相册搜索自动填充功能。我已完成大部分功能,但在执行嵌套调用以检索专辑封面时遇到问题。在这里,我相信是我问题的根源。当我执行ajax调用以检索它确实有效的图像时,我得到了正确的数据,但是返回语句没有被执行。我想要做的是获得前四个结果,每个获得一个图像并返回标签,项目和图像。提前致谢。感谢您的帮助!

 $('#spotify-album-search').autocomplete({
      source:
        function (query, process) {
          $.when(
            $.ajax({
                url: 'http://ws.spotify.com/search/1/album.json?q=' + query.term,
            })
          ).then(function (data) {
            process($.map(data.albums.slice(0, 4), function(item) {
              $.when (
                $.ajax({
                    url: 'https://embed.spotify.com/oembed/?url=' + item.href,
                    dataType: 'jsonp'
                })
              ).then(function (image) {
                // Input: The Rolling Stones
                console.log(item.artists[0].name + ' - ' + item.name + ': ' + image.thumbnail_url);
                // Console: The Rolling Stones - Let It Bleed: https://d3rt1990lpmkn.cloudfront.net/cover/91205a1c80960d7055f8ed1bbe022f195e1767a4
                return { label: item.artists[0].name + ' - ' + item.name, album: item, image: image.thumbnail_url };
              });
            }));
          });
      },
      select: function (e, ui) {
        console.log("selected= " + ui.item.album);
      },
      messages: {
        noResults: '',
        results: function() {}
      }
    })
    .data('ui-autocomplete')._renderItem = function(ul, item) {
      return $('<li></li>')
          .data( "ui-autocomplete-item", item)
          .append('<a>' + item.label + '<img src="' + item.image + '" alt="" />' + '</a>')
          .appendTo(ul);
    };

编辑: 如果您认为可以提供帮助,在这里您可以找到一个工作小提琴! http://jsfiddle.net/9GbkL/

2 个答案:

答案 0 :(得分:0)

在异步编程中,return仅对强制退出有用。你实际上无法返回数据....

在异步编程中使用数据的唯一方法是将其发送到函数。

因此,您需要一个可以在给定数据的情况下更新UI的函数...

添加此功能,目前使用数据完成console.log测试。

答案 1 :(得分:0)

感谢Godsbest在jQuery论坛的帮助,我能够让这个工作。 Paul是对的,我需要函数调用而不是return语句。如果有人遇到过像我这样的问题,那么使用Bootstrap 3和Spotify元数据API就可以解决自动完成问题:

JS:

$('#spotify-album-search').autocomplete({
      source:
        function (query, process) {
          $.when(
            $.ajax({
                url: 'http://ws.spotify.com/search/1/album.json?q=' + query.term,
            })
          ).then(function (data) {
            var process_data = [];
            $.each(data.albums.slice(0, 4), function(i,item) {
              $.when (
               $.ajax({
                  url: 'https://embed.spotify.com/oembed/?url=' + item.href,
                  dataType: 'jsonp'
               })
              ).then(function (image) {
                process_data.push( { artist: item.artists[0].name, album_name: item.name, label: item.artists[0].name + ' - ' + item.name, album: item, href: item.href, image: image.thumbnail_url.replace("cover", "60")} );
                process( process_data );
              });
            });
          });
      },
      open: function(event, ui) {

      },
      select: function (e, ui) {
        e.preventDefault();
        $('#spotify-id').val(ui.item.album.href);
        $(this).val(ui.item.label);
      },
      messages: {
        noResults: '',
        results: function() {}
      }
    })
    .data('ui-autocomplete')._renderItem = function(ul, item) {
      return $('<li>')
          .data( "ui-autocomplete-item", item)
          .append('<a>' + '<img width="50" src="' + item.image + '" alt="" />' + '<span class="ui-autocomplete-artist">' + item.artist  + '</span>' + '<span class="ui-autocomplete-divider"><i class="fa fa-minus"></i></span>' + '<span class="ui-autocomplete-album-name">' + item.album_name  + '</span>' + '<span class="ui-autocomplete-icon pull-right"><i class="fa fa-plus-circle fa-2x"></i></span>' + '</a>')
          .appendTo(ul);
    };

http://jsfiddle.net/9GbkL/5/。快乐的编码!