A simple technique to promisify Chrome extension API

hankchiutw profile image Hank Chiu ・1 min read

One of my pain when developing a Chrome extension is looking at the callback-based APIs. There are some polyfill promisified all the APIs. (e.g. webextension-polyfill)

If you just want some light-weight solution, here you are.

The simple trick is to take advantage of the truth that the callback function is always the last argument, and you can create a simple helper function to promisify the chrome API:

function toPromise(api) {
  return (...args) => {
    return new Promise((resolve) => {
      api(...args, resolve);

and use it like:


This just works for me most of the time.


Editor guide

I would like to have a crossbrowser solution how would this look in Firefox?


Do you mean for Firefox extension?


The Extension API yes, simple develop once run in every browser.

From MDN, it says "Firefox also implements these APIs under the chrome namespace using callbacks".

So, I guess the code toPromise(chrome.tabs.query)({}).then(...); should work on Firefox as well.(hopefully)