在Meteor方法中承诺之后插入集合

Inserting into Collection after Promises in a Meteor Method

本文关键字:之后 插入 集合 承诺 Meteor 方法      更新时间:2023-09-26

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

为了获取所有页面的数据,我决定递归地执行此操作。

让我试着重新描述一下这里发生的事情:

  1. 旅程从上面显示的代码的最后一行开始
  2. 获取初始页面,并首次运行doThisAfterResponse()
  3. 我们首先将返回的数据转储到我们的sales数组中,然后检查响应是否为我们提供了到下一页的链接(作为我们是否在最后一页的指示)
  4. 如果是,我们将增加页面数,并使用相同的函数再次调用API以再次处理响应
  5. 如果不是,则表示我们已进入最后一页。现在是时候使用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
}