Skip to content
NewBun 1.4.5 is out. Release notes
AphrodyBun

Linter · Rules

promise/no-multiple-resolved

Disallow paths that call resolve or reject more than once in a new Promise() executor

A promise settles once. Every later call to resolve or reject is ignored without an error, and the code around it still runs. A second call on the same path usually means a missing return or else.

The rule checks the function passed to new Promise() and each function inside it, one function at a time.

Configure

Off by default. To turn it on:

bunfig.toml
[lint.rules]
"promise/no-multiple-resolved" = "error" # or "warn"

Examples

Reported:

function readConfig(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, "utf8", (err, text) => {
      if (err) {
        reject(err);
      }
      resolve(text); // also runs after reject(err)
    });
  });
}

Not reported:

function readConfig(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, "utf8", (err, text) => {
      if (err) {
        reject(err);
        return;
      }
      resolve(text);
    });
  });
}

A reject in a catch block is fine if nothing after resolve in the try can throw:

new Promise((resolve, reject) => {
  try {
    resolve(JSON.parse(text));
  } catch (err) {
    reject(err);
  }
});
new Promise((resolve, reject) => {
  try {
    resolve(JSON.parse(text));
    log("parsed"); // if this throws, reject runs after resolve
  } catch (err) {
    reject(err);
  }
});