javascript - 在 Meteor 方法中的 Promise 之后插入集合

标签 javascript node.js 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)

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

让我尝试回顾一下这里发生的事情:

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

相关文章:

javascript - 如何动态生成表格并对行进行分组

javascript - 在 highchart 的工具提示中创建图表

javascript - mongoDB - 如何在多个文档中查找和排序多个字段并将它们存储在单个数组中?

javascript - 具有异步功能的 Node JS Webpack Babel

javascript - 为什么 Node.js 中的事件不使用常量?

javascript - 每当我以 meteor Angular 刷新页面时, `Meteor.user()` 方法将返回未定义

mongodb - 使用 meteor 中的嵌入对象更新集合

javascript - 可拖动的对话框作为可拖动的 iframe(或可拖动的 div)

node.js - Stripe 创建使用记录错误 - 时间戳必须在订阅的当前期间结束时间之前 - Date.now()?

meteor - 如何在 Meteor Spacebars 模板中重复 N 次 block ?