我正在使用这个Gumroad-API npm 包,以便从外部服务(Gumroad)获取数据。不幸的是,它似乎使用了 .then()
构造,这可能会有点笨拙,您将在下面发现:
这是我的 meteor 方法:
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'})
但完全相同的行为是观察到。
我真正需要做的是获取信息,然后将其存储到服务器上的数据库中。我怎样才能做到这一点?
编辑:另请参阅我提出的其他(更简单的)SO问题:
Calling a Meteor Method inside a Promise Callback [Halting w/o Error]
最佳答案
我最终放弃了 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
}
关于javascript - 在 Meteor 方法中的 Promise 之后插入集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34371053/