Пагинация узлов в хранилище данных Google

У меня возникли проблемы с разбиением на страницы в хранилище данных Google. У меня есть запрос, который без ограничения дает несколько сотен результатов. Я хотел бы получить 5, отправить их обратно пользователю, если пользователь хочет больше, он получит следующие 5.

Следуя документам, я создаю запрос:

var query = datastore.createQuery('ResultsKind').filter('name', 'bobby').limit(5).autoPaginate(false);

Затем я запускаю этот запрос, чтобы получить первые 5 результатов:

datastore.runQuery(query, callback);

Это функция обратного вызова:

function callback(err, entities, nextQuery, apiResponse) {
    if (err) {
        // An error occurred while running the query.
        console.log('err ' + err);
        return;
    }

    if (nextQuery) {
        console.log('res = ' + entities);
        datastore.runQuery(nextQuery, callback);
    } else {
        // No more results exist.
        console.log('no more results');
        return;
    }
};

Проблема в том, что res = печатается бесконечное количество раз без каких-либо результатов в консоли. Я не уверен, что я делаю неправильно. То, что я хотел бы, чтобы произошло.

1) I create the initial query.
2) I run the query.
3) I get the first 5 results.
4) I pass these results + the nextquery object to the user.
5) If the user wants more results the pass me back the nextQuery and I run this query and get the next 5 results and so on.

Я просматривал этот документ: http://googlecloudplatform.github.io/gcloud-node/#/docs/v0.30.2/datastore/query?method=autoPaginate.

Как я могу выполнить эту простую разбивку на страницы?


person user2924127    schedule 10.04.2016    source источник


Ответы (1)


Из своего обратного вызова вы повторно запускаете запрос сразу после console.log:

if (nextQuery) {
    console.log('res = ' + entities);
    datastore.runQuery(nextQuery, callback); // <-- Here
}

По сути, это то же самое, что и autoPaginate(true). Вместо этого вы должны удалить эту строку, кэшировать nextQuery, а затем запустить ту же строку, которую вы удалили, чтобы получить следующий пакет результатов, когда пользователь попросит об этом.

person Stephen    schedule 10.04.2016