You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写带条件的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);
      }
    });
  }
}

为什么这样有效?

  1. 去掉多余的外层Promise:既然doSomething()已经返回Promise,直接返回它就好,没必要手动new一个新的Promise包裹,这会让代码更简洁,也避免了嵌套带来的逻辑混乱。
  2. 正确延续Promise链:在then回调里返回值(或者Promise.reject),确保Promise的状态能正确传递,不会出现"未返回的Promise",自然就消除了警告。

这样修改后,函数功能和你预期完全一致,代码也更规范。

内容的提问来源于stack exchange,提问作者Lukas Sorensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:39:47