Require returning inside each then()
to create readable and reusable Promise chains (promise/always-return
)
💼 This rule is enabled in the following configs: ✅ flat/recommended
, ✅
recommended
.
Ensure that inside a then()
you make sure to return
a new promise or value.
See http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html (rule #5)
for more info on why that's a good idea.
We also allow someone to throw
inside a then()
which is essentially the same
as return Promise.reject()
.
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'
}
})
myPromise.then(function (val) {})
myPromise.then(() => {
doSomething()
})
myPromise.then((b) => {
if (b) {
return 'yes'
} else {
forgotToReturn()
}
})
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)
})
}
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()
})