0

更新:新的预览 API 提供了一个简单的解决方案!

好的,我在使用新的 Spotify 预览 api 1.x 时遇到问题。此外,这是一个一般的 javascript/jquery ajax 问题。

我有一个从我的服务器后端获取 json 数组的函数。该数组表示包含音乐曲目(名称、艺术家)的一些推荐。完成后,我想通过 spotify api 搜索这些曲目。

 $.when(getCurrentRecommendationList()).done(function(result) {
            console.log(result);
            matchRecommendations(result, showTracksList);
        });

到目前为止,一切都很好。我的匹配推荐功能如下所示:

var matchedTracks = [];
for ( var i = 0; i < result.length; i++) {
    var searchTerm = result[i].song.artist + " " + result[i].song.name;
    var track;

    // Search with SPOTIFY API
    require([ '$api/search#Search' ], function(Search) {
        var search = Search.search(searchTerm);
        search.tracks.snapshot(0, 1).done(function(snapshot) {
        track = snapshot.get(0);
            if (track) {
                var rec = new Recommendation(result[i].id, track);
                matchedTracks.push(rec);
            }
        });
    });
}
return matchedTracks;

不要担心搜索一切正常。问题是搜索需要一些时间,并且在搜索完成之前返回了我的matchedTracks。

我认为 jquery 的 deferred 将是解决方案,但由于我是 javascript 和 jquery 的新手,我无法真正让它们按照我想要的方式工作,主要是因为循环给我带来了麻烦 ^^。

有什么想法可以解决这个问题吗?

4

1 回答 1

0

Javascript 希望是异步的,所以不要从方法返回轨道,使用完成的回调。

matchRecommendations(result, showTracksList, function(matchedTracks) {
    console.log("tracks finished", matchedTracks);
});



function matchRecommendations(result, showTracksList, matchedTracksCallback) {
    var matchedTracks = [];
    for ( var i = 0; i < result.length; i++) {
        var searchTerm = result[i].song.artist + " " + result[i].song.name;
        var track;

        // Search with SPOTIFY API
        require([ '$api/search#Search' ], function(Search) {
            var search = Search.search(searchTerm);
            search.tracks.snapshot(0, 1).done(function(snapshot) {
            track = snapshot.get(0);
                if (track) {
                    var rec = new Recommendation(result[i].id, track);
                    matchedTracks.push(rec);
                }
            });

            // Call the callback after all tracks are added
            matchedTracksCallback(matchedTracks);
        });
    }

    // don't return anything here
    // return matchedTracks;
}

我不熟悉 spotify api 知道何时调用回调,虽然......

于 2013-02-28T20:19:21.347 回答