我正在使用这个Gumroad-API npm包,以便从外部服务(Gumroad)获取数据。不幸的是,它似乎使用了.then()
结构,这可能会变得有点笨拙,正如您将在下面发现的那样:
这是我的流星方法:
Meteor.methods({
fetchGumroadData: () => {
const Gumroad = Meteor.npmRequire('gumroad-api');
let gumroad = new Gumroad({ token: Meteor.settings.gumroadAccessKey });
let before = "2099-12-04";
let after = "2014-12-04";
let page = 1;
let sales = [];
// Recursively defined to continue fetching the next page if it exists
let doThisAfterResponse = (response) => {
sales.push(response.sales);
if (response.next_page_url) {
page = page + 1;
gumroad.listSales(after, before, page).then(doThisAfterResponse);
} else {
let finalArray = R.unnest(sales);
console.log('result array length: ' + finalArray.length);
Meteor.call('insertSales', finalArray);
console.log('FINISHED');
}
}
gumroad.listSales(after, before, page).then(doThisAfterResponse); // run
}
});
由于NPM包使用以下内容公开了Gumorad API:
gumroad.listSales(after, before, page).then(callback)
为了获取所有页面的数据,我决定递归地执行此操作。
让我试着重新描述一下这里发生的事情:
- 旅程从上面显示的代码的最后一行开始
- 获取初始页面,并首次运行
doThisAfterResponse()
- 我们首先将返回的数据转储到我们的
sales
数组中,然后检查响应是否为我们提供了到下一页的链接(作为我们是否在最后一页的指示) - 如果是,我们将增加页面数,并使用相同的函数再次调用API以再次处理响应
- 如果不是,则表示我们已进入最后一页。现在是时候使用
R.unnest
格式化数据,并最终将数据的finalArray
插入到我们的数据库中了
但这里发生了一件有趣的事。整个执行在Meteor.call()
处停止,我甚至没有得到服务器日志的错误输出。
我甚至试着把Meteor.call()
换成一个简单的:Sales.insert({text: 'testing'})
,但观察到了完全相同的行为。
我真正需要做的是获取信息,然后将其存储到服务器上的数据库中。我怎样才能做到这一点?
编辑:请参阅另一个(简化得多)所以我提出的问题:
在Promise回调中调用Meteor方法[无错误暂停]
我最终放弃了NPM包并编写了自己的API调用。我一直不知道如何在.then()
内打电话。这是代码:
fetchGumroadData: () => {
let sales = [];
const fetchData = (page = 1) => {
let options = {
data: {
access_token: Meteor.settings.gumroadAccessKey,
before: '2099-12-04',
after: '2014-12-04',
page: page,
}
};
HTTP.call('GET', 'https://api.gumroad.com/v2/sales', options, (err,res) => {
if (err) { // API call failed
console.log(err);
throw err;
} else { // API call successful
sales.push(...res.data.sales);
res.data.next_page_url ? fetchData(page + 1) : Meteor.call('addSalesFromAPI', sales);
}
});
};
fetchData(); // run the function to fetch data recursively
}