Поэтому я запрашиваю у Spotify данные о некоторых плейлистах, где максимальный размер возвращаемой полезной нагрузки равен 50. Поэтому я хотел бы позвонить getPages
и продолжать вызывать его рекурсивно while !payload.length === 50
.FYI rp = request-обещание, которое делает то, на что это похоже - делает запрос и возвращает обещание для этого запроса.
Мой код работает хорошо, если я выполню его один раз, но когда я добавляю более одного обещания кцепочка, хранение данных испортится.Из-за разочарования я указал кешам на отдельные ключи в cacheIT
(каждый ключ - это идентификатор списка воспроизведения, в котором хранится ключ - массив каждой дорожки, которую я выбрал для указанного ключа), думая, что у меня просто есть плохие ссылки, но это нене поможетЧувствуется, что я здесь упускаю что-то простое ...
let req = {}; req.body = {}; req.body.playlists = [];
req.body.playlists.push({id:"0fEQxXtJS7aTK4qrxznjAJ"});
req.body.playlists.push({id:"0sJK4pWqr7bnQ0fgxGmJrh"});
let cacheIT = {};
function getPages(options) {
console.log(options.uri);
return rp(options).then(data => {
cacheIT[options.playlist_id].concat(data.items);
console.log("data",data.items.length);
console.log("cacheIT",cacheIT[options.playlist_id].length);
if (!(data.items.length === 50))
return options.store;
else
options.offset = options.offset + offset_base ;
options.uri = options.url +
"?fields=items.track(id,name,artists)&limit="+ options.limit +
"&offset=" + options.offset;
return getPages(options);
});
}
req.body.playlists.forEach(function(playlist){
options.url = url1 + playlist.id + url2;
options.uri = options.url + "?fields=items.track(id,name,artists)&limit=" + options.limit + "&offset=" + options.offset;
options.offset = 0;options.limit = 50;
options.playlist_id = playlist.id;
cacheIT[options.playlist_id] = [];
options.store = cacheIT[options.playlist_id];
promises.push(getPages(options));
});
Promise.all(promises)
.then(function(results) {
console.log("results",results.length);
//one of them has 38 records, and the other 148
//so here I would expect there to be two arrays in results
//one would have length 38, the other 148
results.forEach(function(r){
console.log(r.length);
});
//res.send(cacheIT);
}) .catch(function(err) {
console.log("err");
console.log(err);
});