2015-08-15 4 views
4

Я пытаюсь использовать API Gmail для извлечения всех субъектов потоков в учетной записи gmail.Получить темы темы Gmail (разумным способом)

Это легко с threads.list, но это в основном получает идентификатор темы, а не темы.

Единственный способ, который я нашел, - использовать threads.list, затем для каждого потока, вызвав threads.get и извлекая объект из заголовков в метаданных полезной нагрузки.

Очевидно, что это вызывает множество вызовов API, то есть 101 вызов, если существует 100 потоков.

Есть ли лучший способ?

Вот код, который я сейчас использую:

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); 

ответ

3

К сожалению, не существует способа, чтобы получить больше, чем одна нить предмет в то время, через текущий API. Тем не менее, есть несколько вещей, которые вы могли бы сделать, чтобы улучшить производительность:

  1. Используйте функцию пейджинга в API, чтобы получать ограниченное количество потоков одновременно.

  2. Выбирать партии сообщений параллельно, а не пытаться извлекать все сразу или по одному за раз. Экспериментируйте для себя, но 5 из них будут хорошим числом.

  3. Если это реализация браузера, подумайте о том, чтобы сделать звонок в ваш сервер, вместо того, чтобы делать вызовы из браузера. Таким образом, клиент делает только 1 вызов на страницу и позволяет вам потенциально добавлять к вашему серверу механизмы кэширования и предварительной загрузки, что улучшит работу с клиентами. Потенциальный недостаток здесь - масштабируемость; поскольку вы получаете больше клиентов, вам понадобится значительно больше вычислительной мощности, чем подход с жирным клиентом.

В качестве примера # 2, вы могли бы принести-первоначально, а затем обратный вызов для каждой функции сгореть следующий вызов, так что всегда 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(); 
    } 
}); 
+0

Спасибо. Не могли бы вы рассказать о точке 2 с кодом? Асинхронно получать сообщения для threadIds, в отличие от их последовательного получения, тем самым повышая производительность, я полагаю, вы подразумеваете. – newfivefour

+0

Вы работаете в браузере или в узле? – rrowland

+0

Я в браузере. – newfivefour

Смежные вопросы