Zapier 中的分页

Pagination in Zapier

我正在尝试使用以下代码从 Zapier 中的分页 API 中获取所有记录。

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")};

我该如何解决这个问题?

您的问题是,尽管您正在 await 执行该函数,但在您的代码有机会 运行 之前,顶层继续执行并结束执行。

好消息是,Zapier 已经将您的代码包装在异步函数中,因此您可以在顶层使用 await(根据 these docs)。

试试这个:

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()
}

我注意到这是一种递归方法。这很好,但请记住,您的执行时间有限。您也可能会达到内存限制(取决于您返回的对象数量),因此请注意这一点。