如何编写带条件的Promise?解决未返回Promise警告问题
解决Promise警告:"a promise was created at handler but was not returned from"
你遇到的这个警告,本质上是代码犯了Promise包装反模式的问题,同时没有正确延续Promise链。咱们一步步拆解问题,给出符合最佳实践的修正方案:
问题根源
你的原始代码手动创建了一个外层Promise,但其实doSomething()和doSomethingElse()本身就会返回Promise,完全没必要再套一层新的Promise。更关键的是,内部的then回调没有返回值(或者说没有传递内部Promise的结果),导致Promise链断裂,这才触发了警告。另外代码还有个小语法疏漏:每个then的回调函数后面都缺了闭合的),不过你说功能正常,应该是输入时的笔误。
修正后的正确实现
我们可以直接返回条件分支对应的Promise,同时正确处理then里的结果,既消除警告,又保持功能符合预期:
方式1:返回布尔值(resolved状态)
isAuthorized(params) { if (params.property) { // 直接返回doSomething的Promise,then中转换结果为布尔值 return doSomething().then(e => !!e); } else { return doSomethingElse().then(e => !!e); } }
这种写法下,当e为真时,Promise会resolved为true;否则resolved为false。如果需要在e为假时触发reject,可以用下面的方式:
方式2:根据结果resolve/reject
isAuthorized(params) { if (params.property) { return doSomething().then(e => { if (e) { return true; // resolved为true } else { return Promise.reject(false); // 显式reject为false } }); } else { return doSomethingElse().then(e => { if (e) { return true; } else { return Promise.reject(false); } }); } }
为什么这样有效?
- 去掉多余的外层Promise:既然
doSomething()已经返回Promise,直接返回它就好,没必要手动new一个新的Promise包裹,这会让代码更简洁,也避免了嵌套带来的逻辑混乱。 - 正确延续Promise链:在
then回调里返回值(或者Promise.reject),确保Promise的状态能正确传递,不会出现"未返回的Promise",自然就消除了警告。
这样修改后,函数功能和你预期完全一致,代码也更规范。
内容的提问来源于stack exchange,提问作者Lukas Sorensen
相关产品推荐
相关产品推荐

