使用Promises遇each then()需返回值或抛出异常报错的原因咨询
解决Promise报错:Each then() should return a value or throw
嘿,这个报错我太熟了!其实它是ESLint这类代码质量检测工具给你的规范提醒,核心问题出在你的then()回调函数里没有返回值(也没有抛出错误),导致Promise链出现了“断层”,工具会认为这大概率是你的疏忽,可能引发潜在的逻辑问题。
为什么会出现这个报错?
ESLint的promise/always-return规则(类似的代码检测规则)要求:每个then()的回调函数必须满足以下两个条件之一:
- 返回一个值(可以是普通值、另一个Promise,甚至
undefined) - 抛出一个错误(用于在Promise链中传递异常)
举个典型的错误示例,你可能写了这样的代码:
// 错误写法:then回调没有返回值 Promise.all([asyncFunc1(), asyncFunc2()]) .then(results => { // 处理结果,但完全没写return console.log("执行完成:", results); }) .catch(err => { console.error("出错了:", err); });
这里的then()回调只做了打印操作,没有返回任何内容,代码检测工具就会抛出那个报错。
怎么修复这个问题?
根据你的业务需求,有几种常见的修复方式:
1. 不需要继续Promise链?明确返回值
如果这个then()是Promise链的最后一步,直接加个return(或者返回具体值)即可:
Promise.all([asyncFunc1(), asyncFunc2()]) .then(results => { console.log("执行完成:", results); return; // 明确返回,或者返回你需要的值比如return results; }) .catch(err => { console.error("出错了:", err); throw err; // 若需要把错误向上传递,就抛出;不需要的话也可以return });
2. 需要继续链式调用?返回后续逻辑的结果
如果后面还要接着用then()处理,就返回你的处理结果或者新的Promise:
Promise.all([asyncFunc1(), asyncFunc2()]) .then(results => { // 处理结果后返回新的值/Promise return processResults(results); }) .then(processedData => { return sendResponse(processedData); // 继续链式调用 }) .catch(err => { console.error("出错了:", err); throw err; });
3. 换用async/await语法(更直观,不易出错)
如果你的运行环境支持ES2017+,async/await写法能避免这类链式回调的问题,代码可读性也更高:
async function handleRequest() { try { // 等待所有异步方法完成 const results = await Promise.all([asyncFunc1(), asyncFunc2()]); console.log("执行完成:", results); // 这里的return会作为函数Promise的结果返回 return processResults(results); } catch (err) { console.error("出错了:", err); throw err; // 向上抛出错误 } }
总结
这个报错不是JavaScript本身的语法错误,而是代码质量工具帮你提前规避潜在问题——比如不小心遗漏了返回值,导致后续Promise链无法获取正确的结果。只要确保每个then()回调要么返回值,要么抛出错误,就能轻松解决啦!
内容的提问来源于stack exchange,提问作者Tometoyou
相关产品推荐
相关产品推荐

