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#

example.js1 problem
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)
    });
  });
}
example.jsNo problems
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:

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