0

我正在使用 node.js 模块“shopify-api-node”来调用 Shopifys graphql API。我可以在文档中看到您可以通过 callGraphqlLimits 访问限制信息,但是您应该如何使用它来限制请求?

如果我想将下一次调用延迟 5 秒,我尝试了这个,但延迟似乎是异步执行的(在测试时,我通过检查限制何时小于 1000 来强制立即限制):

shopify.on('callGraphqlLimits', async (limits) => {
    console.log(limits)
    if (limits.remaining < 1000){
      console.log('Delaying 5s')
      await delay(5000)
    }
  })

谢谢,-路易丝

4

1 回答 1

0

这是我使用该库管理节流的方法。从概念上讲,该过程如下;

  • 进行查询
  • 确定您的剩余费用
  • 等待所需的秒数
  • 重复

因此,如果我有一个昂贵的查询,该过程可能看起来像这样(为简洁起见,省略了分页内容)

async function expensiveQuery() {
  let currentCost = 0;
  let hasNextPage;
  
  shopify.on('callGraphqlLimits', (limits) => {
    currentCost = limits.current;
  });

  do {
    const waitTime = Math.ceil(currentCost / 50); // 50 is the default restore rate
    await timeout(waitTime * 1000);
    const data = await shopify.graphql(GET_PRODUCTS);
    const { products: { edges, pageInfo } } = data;
    // do something with data;
    hasNextPage = pageInfo.hasNextPage;
  } while (hasNextPage)
}

function timeout(ms) { // helper function
  return new Promise(resolve => setTimeout(resolve, ms));
}

这将始终清除您当前的成本,因此您将始终拥有“满桶”。但是,如果我们知道查询的成本,您可以做一些更复杂的事情。理想情况下,您不想等到存储桶已满,而只需等待足够长的时间,以便您有足够的可用成本来执行查询。

于 2021-05-28T15:54:21.437 回答