在Meteor方法中承诺之后插入集合
Inserting into Collection after Promises in a Meteor Method
我正在使用这个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
}
相关文章:
- 如何在 d3.js 中的同级元素之后插入
- 在原始克隆之后插入克隆
- 如何在字符串中的第二个字符之后插入字符
- 我可以在 Javascript 中的 onclick 中的“this”之后插入字符串吗?
- 如何使用原型.js在文本块之后插入内容
- 通过jQuery在最后一项之后插入
- 如何使用jQuery在具有类的特定元素之后插入HTML
- 如何在第二个元素之后插入
- 如何在文本的每 5,000 个字符之后的第一个
或
之后插入一个 - jQuery 在最后一个元素之后插入
- Node.js:在文本文件中的特定行之后插入一行
- 在Meteor方法中承诺之后插入集合
- 在“”之后插入文本;这个“;使用javascript输入元素
- 在动态生成的表之后插入一个来自jQuery的跨度
- 找到一个元素,然后在下一个元素之后插入内容
- 在每个函数的特定结果之后插入元素
- 具有相同类的多个元素-仅在最后一个元素之后插入
- 在特定字符之后插入文本
- 在argv[2]NodeJ之后插入参数
- 在没有自动丢失标记的图元之前和之后插入内容