获取 Gmail 线程主题(以一种理智的方式)

Get Gmail thread subjects (in a sane way)

我正在尝试使用 Gmail API 检索 Gmail 帐户中的所有线程主题。

使用 threads.list 很容易,但这主要是获取线程的 ID,而不是主题。

我发现的唯一方法是使用 threads.list,然后为每个线程调用 threads.get 并从有效负载元数据中的 headers 中获取主题。

显然这会产生很多 API 次调用,即如果有 100 个线程,则调用 101 次。

有没有更好的方法?

这是我目前使用的代码:

var getIndivThread = function(threads) {
  threads.threads.forEach(function(e) {
    indivThreadRequst.id = e.id, 
    gmail.api.users.threads.get(indivThreadRequst).execute(showThread);
  });
};
var indivThreadRequst= {
    format: 'metadata',
    metadataHeaders:['subject'], 
    userId: myUserId, 
    maxResults:1};
var showThread = function(thread) {
  console.log(thread.messages[0].payload.headers[0].value);
};
gmail.api.users.threads.list({userId:myUserId}).execute(getIndivThread);

遗憾的是,当前 API 无法同时获取多个线程主题。但是,您可以采取一些措施来提高性能:

  1. 使用 API 的分页功能一次获取有限数量的线程。

  2. 并行获取多批消息,而不是尝试一次获取所有消息或一次获取一条消息。自己做实验,但从 5 开始比较合适。

  3. 如果这是浏览器实现,请考虑调用您的后端而不是从浏览器进行调用。通过这种方式,客户端每个页面仅进行 1 次调用,它允许您向服务器添加缓存和预加载机制,从而改善客户体验。这里的潜在缺点是可扩展性;随着您获得更多的客户端,您将需要比胖客户端方法更多的处理能力。

作为 #2 的示例,您可以最初获取 5 个,然后让每个函数的回调触发下一个调用,因此始终有 5 个并发获取:

var CONCURRENCY_LIMIT = 5;

function getThread(threadId, done) {
  threadRequest.id = e.id;
  gmail.api.users.threads.get(threadRequest).execute(function(thread) {
    showThread();
    done();
  });
}

gmail.api.users.threads.list({userId:myUserId}).execute(function(threads) { 
  function fetchNextThread() {
    var nextThread = threads.shift();
    nextThread.id && getThread(nextThread.id, fetchNextThread);
  }

  for (var i = 0; i < CONCURRENCY_LIMIT; i++) {
    fetchNextThread();
  }
});