Устранение неполадок при поиске API-интерфейса с promise.all (работает только один раз) - PullRequest
0 голосов
/ 14 февраля 2019

Поэтому я запрашиваю у 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);
    });

1 Ответ

0 голосов
/ 14 февраля 2019

getPages возвращает обещание в виде rp(options), и ваше promise.all будет разрешено только на этом уровне.Если вы хотите объединить запросы в цепочку, я предлагаю вам использовать async/await.

async function getPages(options) {
    console.log(options.uri);
    let data = await rp(options);
    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 await getPages(options);
    }
}

. Таким образом, getPages() будет разрешен только после того, как будут решены все ожидания, которые будут, когда data.items.length !== 50

...