Make Promise wait for a Chrome.runtime.sendMessage
It is easier to ask a content-script to do its job and answer when it finished.
To make "sendMessage" work with promises you can wrap it:
/** * Promise wrapper for chrome.tabs.sendMessage * @param tabId * @param item * @returns {Promise<any>} */function sendMessagePromise(tabId, item) { return new Promise((resolve, reject) => { chrome.tabs.sendMessage(tabId, {item}, response => { if(response.complete) { resolve(); } else { reject('Something wrong'); } }); });}
The content-script should have something like this:
// waiting for tasks from backgroundchrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { const item = msg.item; // Asynchronously process your "item", but DON'T return the promise asyncOperation().then(() => { // telling that CS has finished its job sendResponse({complete: true}); }); // return true from the event listener to indicate you wish to send a response asynchronously // (this will keep the message channel open to the other end until sendResponse is called). return true;});