Generator中忽略yield返回值避免未使用变量警告

作者:技术拾光时间:2026-07-30 12:05:10浏览:586

在 JavaScript Generator 函数中,若只需执行 yield 副作用(如发起 API 调用)而无需其返回值,直接赋值给变量会触发 ESLint 的 no-unused-vars 警告;此时可省略变量声明,仅用 yield expression 语句即可安全忽略返回值,无需 void

在 JavaScript Generator 函数中,若只需执行 yield 副作用(如发起 API 调用)而无需其返回值,直接赋值给变量会触发 ESLint 的 no-unused-vars 警告;此时可省略变量声明,仅用 yield expression 语句即可安全忽略返回值,无需 void 或占位符。

结论:直接使用 yield expression,无需变量

在 Generator 函数中,如果只想借 yield 执行一个带副作用的操作——比如发起 API 请求——而完全不关心它的返回值,那么无需声明变量。直接写 yield expression 即可。ESLint 不会报错,代码也更简洁,完全不需要 void 或其他占位符。

工作原理:为什么可以忽略返回值

很多人可能会疑惑:yield 不是会产出一个值吗?怎么能直接丢弃?这里需要理解 Generator 中 yield 的运作机制。它本质上是“暂停执行并交出控制权”——通过 next(value) 传入的值,其实是下一次恢复 Generator 时才能用到的输入,而不是当前 yield 的输出。严格来说,当前 yield expression 表达式的结果——也就是 expression 求值后返回的值——才是被 next() 拿到的 .value。这个值完全可以忽略,就像调用普通函数但不使用其返回值一样,非常自然。

正确写法(推荐)

function* cancelCredit(action) {
  yield call(/* Nice api call 1 */); //  没变量、没警告、意思明明白白
  const res2 = yield call(/* Nice api call 2 */);
  // 该处理 res2 就处理
  yield put({ type: 'CREDIT_CANCELLED' });
}

注意事项

  • void yield call(...) 虽然能绕过 ESLint 警告,但其实是画蛇添足。void 的本意是强制丢弃 Promise 以防止“未处理的拒绝”。但在 Generator 中,yield 本身不会直接返回 Promise,call(...) 的返回值由 redux-saga 这类中间件在后台管理,与 Promise 状态无关,所以没必要。
  • 切勿写成 yield;(不带表达式)。这等价于 yield undefined,不会触发任何异步任务,Generator 会卡住。
  • 如果项目中的 ESLint 规则(如 eslint-plugin-react-hooks 或自定义配置)要求“每个 yield 都必须赋值给变量”,最合理的做法是调整规则配置,而不是在代码中塞入无意义的占位符。代码可读性永远比通过静态检查更重要。

总结

在 Generator 中,yield expression 本身就是一条完整的语句,不需要绑定变量。忽略返回值是一种合法且惯用的写法,既符合语言规范,也能让代码保持简洁和专业感。