2013-04-24 2 views
0

В настоящее время я пытаюсь перенести приложение Spotify в новую версию api 1.0.Spotify Предварительный просмотр API поиск и альбом

У меня возникли проблемы с поиском. Я хочу найти в каталоге строку поиска и получить всю информацию о треке, имена артистов и имена альбомов из результатов поиска. Однако, похоже, что поиск не включает имена альбомов (только URI: s) в результатах.

Должен ли я загружать все имена альбомов для всех результирующих треков после асинхронно? Я хочу избежать этого, если это возможно.

Я ищу, как этот

var search = Search.search(searchString); 
search.tracks.snapshot().done(function(snapshot) { 
    var results = snapshot.toArray(); 
    // no album names in the results tracks 
}).fail(function() { 
    console.error('Error retrieving snapshot'); 
}); 

ответ

1

В API 1.0 некоторые данные не загружаются автоматически. Это означает, что в идеале вы будете получать только нужные данные, уменьшая трафик данных и улучшая производительность. Недостатком является то, что вам нужно будет составить этот массив треков плюс название альбома самостоятельно, извлекая данные по асинхронному способу.

Для каждого трека вы хотите получить название своего альбома. Это, как вы могли бы сделать это:

var maxTracks = 15; 
var search = Search.search(searchString); 
search.tracks.snapshot(0, maxTracks).done(function(snapshot) { 
    snapshot.toArray().forEach(function(result) { 
    result.album.load('name').done(function(album) { 
     // here you have access to the album.name attribute 
    }); 
    }); 
}).fail(function() { 
    console.error('Error retrieving snapshot'); 
}); 

Проблема с этим подходом является то, что вы будете данные в другом порядке, чем тот, в котором появляются следы. Если вам нужно, чтобы сохранить заказ вы можете использовать Promise объект:

var maxTracks = 15; 
var search = Search.search(searchString); 
search.tracks.snapshot(0, maxTracks).done(function(snapshot) { 
    var promises = []; 
    snapshot.toArray().forEach(function(result) { 
    promises.push(result.album.load('name')); 
    }); 
    models.Promise.join(promises) 
    .done(function(albums) { console.log('Loaded all albums.', albums); }) 
    .fail(function(albums) { console.log('Failed to load at least one album.', albums); }); 
}).fail(function() { 
    console.error('Error retrieving snapshot'); 
}); 

Используя массив Promise с сохранит тот же порядок, что и дорожки.

+0

Вторая версия, похоже, хорошо работает для моего приложения, я не был уверен в том, как использовать обещания. – faximan

Смежные вопросы