Promise相关报错求助:then()返回仍报错且部署失败
解决Promise相关ESLint错误:
promise/no-nesting与promise/always-return 我来帮你拆解并解决这些ESLint规则报错,新手遇到这类规则问题确实容易懵,咱们一步步来:
先搞懂每个错误的本质
promise/no-nesting警告:这个规则是为了避免"回调地狱",禁止在一个Promise的then/catch回调里嵌套另一个Promise逻辑,要求代码保持扁平化的链式调用结构,让可读性更强。promise/always-return错误:这个规则强制每个then()回调必须返回一个值(可以是普通值,也可以是另一个Promise),这样Promise链才能正确传递状态和数据,避免出现意外的未处理Promise状态。
针对你的代码片段修复
你给出的报错代码是:
return admin.messaging().sendToDevice(token_id,payload).then(theResult =>{ console.log("then is returned"); });
1. 先解决promise/always-return错误
问题出在then回调里只执行了console.log,没有返回任何值。你只需要在回调最后返回结果(或者你需要传递的其他值)即可:
return admin.messaging().sendToDevice(token_id, payload) .then(theResult => { console.log("then is returned"); // 返回结果,让Promise链继续传递数据 return theResult; });
2. 再处理promise/no-nesting警告
这个警告通常是因为这段代码本身嵌套在另一个Promise的then回调里(比如你的sendNotification函数内部可能还有上层的异步逻辑)。举个例子,如果原来的代码结构是这样的:
exports.sendNotification = functions.https.onCall((data, context) => { return someOtherAsyncTask() .then(() => { // 这里嵌套了sendToDevice的Promise,触发警告 return admin.messaging().sendToDevice(token_id, payload) .then(theResult => { console.log("then is returned"); return theResult; }); }); });
你需要把它改成扁平化的链式调用,去掉嵌套:
exports.sendNotification = functions.https.onCall((data, context) => { return someOtherAsyncTask() .then(() => { // 直接返回sendToDevice的Promise,进入下一个then环节 return admin.messaging().sendToDevice(token_id, payload); }) .then(theResult => { console.log("then is returned"); return theResult; }); });
关于删除函数仍无法部署的问题
如果删除这个函数还是部署失败,说明你的代码里还有其他地方违反了这些ESLint规则。建议你:
- 仔细查看完整的错误日志,定位所有报错的行号
- 检查其他Promise的
then回调,确保每个都返回了值 - 排查是否有其他嵌套的Promise结构(比如在
catch里又用了then却没做扁平化处理)
如果还是找不到问题,可以把完整的sendNotification函数代码贴出来,我再帮你进一步排查。
内容的提问来源于stack exchange,提问作者ashaneen
相关产品推荐
相关产品推荐

