2015-08-15 53 views
4

我正嘗試使用Gmail API檢索gmail帳戶中的所有主題主題。獲取Gmail主題(以一種理智的方式)

這很容易與threads.list,但主要得到的線程的ID,而不是主題。

我發現的唯一方法是使用threads.list,然後,對於每個線程,調用threads.get並從有效負載元數據中的頭文件中獲取主題。

顯然,這會產生很多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); 

回答

3

不幸的是,沒有一種方式來獲得在通過電流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(); 
    } 
}); 
+0

感謝。你能否用代碼闡述第2點?異步地獲取threadId的消息,而不是按順序獲取它們,從而提高性能,這是我假定你的意思。 – newfivefour

+0

你在瀏覽器中還是在節點中? – rrowland

+0

我在瀏覽器中。 – newfivefour

相關問題