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;

検索がすべて正常に機能することを心配する必要はありません。問題は、検索に時間がかかり、検索が完了する前に matchingTracks が返されることです。

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 に答える