更新:新的预览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;
不要担心搜索所有工作正常。问题是搜索需要一些时间,并且在搜索完成之前返回匹配的跟踪。
我认为jquery的推迟将是解决方案,但由于我是javascript和jquery的新手,我无法让它们以我想要的方式工作,主要是因为循环给了我麻烦^^。
有什么想法可以解决这个问题吗?
答案 0 :(得分: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知道何时调用回调,但是......