promise/always-return Suspicious ​
What it does ​
Require returning inside each then() to create readable and reusable Promise chains. We also allow someone to throw inside a then() which is essentially the same as return Promise.reject().
Why is this bad? ​
Broken Promise Chain. Inside the first then() callback, a function is called but not returned. This causes the next then() in the chain to execute immediately without waiting for the called function to complete.
Examples ​
Examples of incorrect code for this rule:
myPromise.then(function(val) {});
myPromise.then(() => {
doSomething();
});
myPromise.then((b) => {
if (b) {
return "yes";
} else {
forgotToReturn();
}
});Examples of correct code for this rule:
myPromise.then((val) => val * 2);
myPromise.then(function(val) {
return val * 2;
});
myPromise.then(doSomething); // could be either
myPromise.then((b) => {
if (b) {
return "yes";
} else {
return "no";
}
});Options ​
ignoreLastCallback ​
You can pass an { ignoreLastCallback: true } as an option to this rule so that the last then() callback in a promise chain does not warn if it does not have a return. Default is false.
// OK
promise.then((x) => {
console.log(x);
});
// OK
void promise.then((x) => {
console.log(x);
});
// OK
await promise.then((x) => {
console.log(x);
});
promise
// NG
.then((x) => {
console.log(x);
})
// OK
.then((x) => {
console.log(x);
});
// NG
const v = promise.then((x) => {
console.log(x);
});
// NG
const v = await promise.then((x) => {
console.log(x);
});
function foo() {
// NG
return promise.then((x) => {
console.log(x);
});
}ignoreAssignmentVariable ​
You can pass an { ignoreAssignmentVariable: [] } as an option to this rule with a list of variable names so that the last then() callback in a promise chain does not warn if it does an assignment to a global variable. Default is ["globalThis"].
/* eslint promise/always-return: ["error", { ignoreAssignmentVariable: ["globalThis"] }] */
// OK
promise.then((x) => {
globalThis = x;
});
promise.then((x) => {
globalThis.x = x;
});
// OK
promise.then((x) => {
globalThis.x.y = x;
});
// NG
promise.then((x) => {
anyOtherVariable = x;
});
// NG
promise.then((x) => {
anyOtherVariable.x = x;
});
// NG
promise.then((x) => {
x();
});How to use ​
To enable this rule in the CLI or using the config file, you can use:
oxlint --deny promise/always-return --promise-plugin{
"plugins": ["promise"],
"rules": {
"promise/always-return": "error"
}
}