Пагинация в Zapier - PullRequest
       11

Пагинация в Zapier

0 голосов
/ 29 сентября 2019

Я пытаюсь использовать следующий код для получения всех записей из разбитого на страницы API в Zapier.

const limitPerPage = 20;
const apiUrl = "https://myurl.com/data";
var lastCursor = null;
var output = null;

const getContent = async function (cursor) {
    let actualUrl = apiUrl + `?cursor=${cursor}&limit=${limitPerPage}`;
    var apiResults = await fetch(actualUrl)
        .then(resp => {
            return resp.json;
        });
}

const getEntireContentList = async function (cursor) {
    const results = await getContent(cursor);
    console.log("Retreiving data from API for cursor : " + cursor);
    if (results.metadata.cursor !== "") {
        return results.concat(await getEntireContentList(results.metadata.cursor));
    } else {
        return results;
    }
};


(async() => {
    const entireList = await getEntireContentList();
    console.log(entireList);
    output = entireList;
    callback(null, entireList);
})();

Я получаю ошибку как Вы не определили output! Попробуйте output = {id: 1, hello: await Promise.resolve("world")};

Как я могу это исправить?

1 Ответ

1 голос
/ 02 октября 2019

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

Хорошая новость заключается в том, что Zapier уже упаковывает ваш код в асинхронную функцию, поэтому вы можете использовать await на верхнем уровне (для этих документов ).

Попробуйте вместо этого:

const limitPerPage = 20;
const apiUrl = "https://myurl.com/data";
let lastCursor = null;
// var output = null; // zapier does this for you already

const getContent = async function (cursor) {
    const actualUrl = apiUrl + `?cursor=${cursor}&limit=${limitPerPage}`;
    const rawResponse = await fetch(actualUrl)
    return resp.json() // async function, you had it as a property
}

const getEntireContentList = async function (cursor) {
    const results = await getContent(cursor);
    console.log("Retreiving data from API for cursor : " + cursor);
    if (results.metadata.cursor !== "") {
        return results.concat(await getEntireUserList(results.metadata.cursor)); // should this be named getEntireContentList?
    } else {
        return results;
    }
};


return {
  results: await getEntireContentList()
}

Я заметил, что это рекурсивный подход. Это хорошо, но помните, что у вас ограниченное время выполнения. Вы также можете столкнуться с ограничением памяти (в зависимости от того, сколько объектов вы возвращаете), так что следите за этим.

...