在meteor方法中承诺后插入到集合中

我正在使用这个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) 

我决定recursion地执行它以获取所有数据页面。

让我试着重新盖上这里发生的事情:

  1. 旅程从上面显示的代码的最后一行开始。
  2. 提取初始页面, doThisAfterResponse()是第一次运行。
  3. 我们首先将返回的数据转储到我们的sales数组中,然后检查响应是否给了我们下一页的链接 (作为是否显示在最后一页上的指示)。
  4. 如果是这样 ,我们增加页面数量,然后再次使用相同的函数再次调用API来处理响应。
  5. 如果没有 ,这意味着我们在我们的最后一页。 现在是时候使用R.unnest来格式化数据,并最终将数据的最后一列插入到我们的数据库中。

但有趣的事情发生在这里。 整个执行在Meteor.call()停止,我甚至没有错误输出到服务器日志。

我甚至尝试将Meteor.call()简单的: Sales.insert({text: 'testing'})但是观察到完全相同的行为。

我真正需要做的是获取信息,然后将其存储在服务器上的数据库中。 我怎样才能做到这一点?

编辑:也请参阅这个其他(更简化)所以我提出的问题:

在Promisecallback中调用meteor方法[停止W / O错误]

我最终放弃了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 }