【问题标题】:Promise inside a sync function never resolves同步函数中的承诺永远不会解决
【发布时间】:2018-05-06 23:04:52
【问题描述】:

当异步函数中的promise函数永远不会解析或拒绝时会发生什么,所以如果两个初始条件都不满足,在下面的save方法中会发生什么,它没有给出错误,它会一直等到收到响应吗?

save().then(results=>{

})

save():promise<any>{
  if (conditionA) {
    return http request
  }
  if (conditonB) {
    return http request}
  }
}

【问题讨论】:

  • 这并不意味着有一个永远不会解决的承诺,它只是意味着你的函数根本没有创建一个承诺,并且.then()undefined 上被调用时会抛出一个异常。不要那样做。
  • 是的,目前我正在修复与此相关的旧代码,它表明无法调用未定义的然后,这就是为什么我想确定这是否是问题

标签: asynchronous promise resolve


【解决方案1】:

如果你的 Promise 有时会返回一个 Promise,那么它应该总是返回一个 Promise。如果您发现不需要在某些代码路径中返回承诺,通常的设计模式是您只需执行return Promise.resolve()。所以,保持你的伪代码,你会做这样的事情:

save().then(results=>{

})

save():promise<any>{
  if (conditionA) {
    return request(...);
  } else if (conditonB) {
    return request(...);
  } else {
    return Promise.resolve(...);
  }
}

您填写上面的... 部分以使您的功能有意义。但是,如果你有时返回一个承诺,那么总是返回一个承诺。然后,调用者可以始终如一地使用返回的承诺。如果工作已经完成(或无事可做),那么您只需返回一个已解决的承诺,调用者始终会获得一致的返回值,他们可以将其用作承诺。


请注意,这些都与您的问题的标题不匹配,但它确实与您的问题的主体完全匹配。您的标题是错误的还是您的问题描述中缺少某些部分?

【讨论】:

  • 谢谢@jfriend00,正如我在 cmets 中提到的,我正在修复我们现有代码中的一些错误,它说“然后出现未定义的错误”我认为因为 else 不存在并且承诺是没有解决所以会发生错误,但作为回复 cmets 我理解它是未创建的承诺,而不是解决的情况
  • @Heshan - 为了让后来出现的其他人不会感到困惑,我建议您使用问题下方的“编辑”链接并修改问题的标题以更好地适应这里发生的情况.
【解决方案2】:

一个简单的答案应该是,如果从包括服务调用(http 调用)的方法返回任何类型的承诺,save() 不能未定义, 如果它永远无法解决,它将永远不会进入处理程序的 then 部分,但它不能给出未定义的错误。 当 if else 条件不满足条件且不返回任何内容时,可能会给出未定义的错误。

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 2019-11-29
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多