Make Promise wait for a Chrome.runtime.sendMessage Make Promise wait for a Chrome.runtime.sendMessage google-chrome google-chrome

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