获取 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 无法同时获取多个线程主题。但是,您可以采取一些措施来提高性能:
使用 API 的分页功能一次获取有限数量的线程。
并行获取多批消息,而不是尝试一次获取所有消息或一次获取一条消息。自己做实验,但从 5 开始比较合适。
如果这是浏览器实现,请考虑调用您的后端而不是从浏览器进行调用。通过这种方式,客户端每个页面仅进行 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();
}
});
我正在尝试使用 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 无法同时获取多个线程主题。但是,您可以采取一些措施来提高性能:
使用 API 的分页功能一次获取有限数量的线程。
并行获取多批消息,而不是尝试一次获取所有消息或一次获取一条消息。自己做实验,但从 5 开始比较合适。
如果这是浏览器实现,请考虑调用您的后端而不是从浏览器进行调用。通过这种方式,客户端每个页面仅进行 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();
}
});