此答案的作者遇到了完全相同的问题。
他想过滤掉邮件正文中包含特定内容的垃圾邮件。
因此,他决定在垃圾文件夹中的电子邮件上测试他的正则表达式。
他阅读了与您完全相同的文档,最终不知道如何将“文件夹”对象正确地传递给 .messages.list(folder) 方法。
第一次“啊哈”的体验是以下阅读:
“WebExtension API 是异步,[...并且]返回一个Promise对象[...]”。
尝试阅读并深入理解以下使用 Promise 对象 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises) 的出色解释有助于解决作者使用以下第一个 [而且大多是快速而肮脏的] 代码的问题。
假设您只知道帐户的“名称”,想要检查特定文件夹,您可以尝试以下代码,该代码为该答案的作者完成:
function accountsList_successCallback( arrayOfMailAccount ) {
let accountId = false;
for (i = 0; i < arrayOfMailAccount.length; i++) {
if ( arrayOfMailAccount[i][ "name" ] == "firstname.lastname@email.com" ) {
accountId = arrayOfMailAccount[i][ "id" ];
break;
}
}
console.log('Last line of function accountsList_successCallback() before return of accountId: ' + accountId );
return accountId;
}
function mailAccount_successCallback( mailAccount ) {
console.log('Last line of function mailAccount_successCallback(), returning mailAccount\'s MailFolder array');
return mailAccount[ "folders" ];
}
function returnWantedMailFolder( Folders ) {
let mailFolder = false;
for (j = 0; j < Folders.length; j++) {
if ( Folders[j][ "type" ] == "trash" ) { // use "inbox" here instead of "trash"
mailFolder = Folders[j];
break;
}
}
console.log('Last line of function returnWantedMailFolder()');
return mailFolder;
}
function messagesList_successCallback( messageList ) {
console.log( "messageListId: " + messageList[ "id" ] );
console.log( "Number of Emails in this Page: " + messageList[ "messages" ].length );
/*
* This is where you can place your messages examining
* rotines...
*
* And don't forget to loop through the next pages.
* You just got the first of maybe several pages.
*
*/
console.log('Last line of function messagesList_successCallback()');
}
function accountsList_failureCallback(error) {
console.error( "Fehler (accountsList_failureCallback) : " + error);
}
function accountsGet_failureCallback(error) {
console.error( "Fehler (accountsGet_failureCallback) : " + error);
}
function mailAccount_failureCallback(error) {
console.error( "Fehler (mailAccount_failureCallback) : " + error);
}
function returnWantedMailFolder_failureCallback(error) {
console.error( "Fehler (returnWantedMailFolder_failureCallback) : " + error);
}
function messagesList_failureCallback(error) {
console.error( "Fehler (messagesList_failureCallback) : " + error);
}
browser.accounts.list()
.then( accountsList_successCallback,
accountsList_failureCallback) // after .list() is fulfilled...
// accountsList_successCallback is called, which
// in this example returns the accountId string...
.then( accountId => browser.accounts.get( accountId ),
accountsGet_failureCallback) // returns a MailAccount Promise, passed to ...
.then( mailAccount_successCallback,
mailAccount_failureCallback) // returns an array of MailFolder...
.then( arrayMailFolders => returnWantedMailFolder( arrayMailFolders ),
returnWantedMailFolder_failureCallback)
.then( mailFolder => browser.messages.list( mailFolder ), // <-- this was the problem, right?
messagesList_failureCallback) // returns a page Promise, passed to ...
.then( messagesList_successCallback,
messagesList_failureCallback)
;
此代码可以肯定并且会进一步优化。一些“failureCallback”例程可能永远不会被调用。在 .then() 链的末尾使用单个 .catch( failureCallback ),您可以消除所有其他 failureCallback 函数。
在这个答案的作者检查之前,需要这么多的 failureCallback 函数,在这种“新”思维中到底发生了什么。
此答案的作者祝您好运。理查德。