Javascript 我可以用蓝知更鸟的承诺提前打破链条吗?

Javascript 我可以用蓝知更鸟的承诺提前打破链条吗?,javascript,promise,bluebird,Javascript,Promise,Bluebird,我不一定想出错,但我有: getFromDb().then (tradeData) -> if not tradeData # DO NOT CONTINUE THE CHAIN else getLatestPrice tradeData .then (latestPrice) -> ... .then -> ... .then -> ... .catch (err) -> next err 如果没有tradeData,我有

我不一定想出错,但我有:

getFromDb().then (tradeData) ->
  if not tradeData
    # DO NOT CONTINUE THE CHAIN
  else
    getLatestPrice tradeData
.then (latestPrice) ->
  ...
.then ->
  ...
.then ->
  ...
.catch (err) ->
  next err
如果没有tradeData,我有没有办法中止链

getFromDb().then (tradeData) ->
  if tradeData
    getLatestPrice tradeData ->
      .then (latestPrice) ->
        ...
      .then ->
        ...
      .then ->
        ...
      .catch (err) ->
        next err
  else
    getSomethingElse ->
       send("no data")
在3.0中,您将能够执行以下操作:

p = getFromDb().then (tradeData) ->
  if not tradeData
    send("no data");
    p.break()
  else
    getLatestPrice tradeData
.then (latestPrice) ->
  ...
.then ->
  ...
.then ->
  ...
.catch (err) ->
  next err

虽然这是一个公认的答案,但我想告诉所有谷歌用户,“break()”函数已改为“cancel()”

使用类似以下内容:

p = getFromDb().then (tradeData) ->
  if not tradeData
    send("no data");
    p.cancel(); // Look Here!!!!!!!!!!!!!!!!
  else
    getLatestPrice tradeData
.then (latestPrice) ->
  ...
.then ->
  ...
.then ->
  ...
.catch (err) ->
  next err
在此之前,请确保在配置中添加以下行:

Promise.config({
    cancellation: true
});

我只是想知道为什么不利用这样一个事实:你可以
抛出你喜欢的任何东西,而不仅仅是
出错的瞬间。这样做被认为是不好的做法?在我看来,这取决于,这取决于你正在努力完成什么。承诺链可能会因各种原因而中断,但通常这两种情况会分为两类<代码>出现经典错误
并且需要
提前断链
。从逻辑上讲,第二个错误不能被认为是错误的
实例

const handleError = (err) => {
  ...
}

const skip = (reason, ..., ...) => {
  /**
   * construct whatever you like
   * just for example here return reason
   */
  return reason
}

Promise.resolve()
.then(() => {
  if (iShouldEndChainEarlier) {
    throw skip('I would like to end chain earlier')
  }

  return asyncOperation1()
})
.then(results => {
  ...
  return asyncOperation2(results)
})
.then(... => {
  ...
})
.catch(interrupt => {
  if (interrupt instanceof Error) {
    return handleError(interrupt)
  }

  /**
   * Handle breaking promise chain earlier
   * having interrupt reason in scope
   */
})
如果从逻辑上讲,链中的早期中断可以被视为错误(完全是这样),您可以创建自定义错误,并在
catch
块中区分这两个错误。所以说,在处理承诺链中可能发生的任何中断时,可以考虑另一种方法


我们可以说,这是否可以被视为与节点中的第一个错误模式相抵触。如果出现错误,最佳做法是调用回调,如
callback(err)
其中
err
实际上应该是
instanceof error
,否则
回调(null,data)
。但另一方面,请记住,
.catch(fn)
只是
的糖,然后(未定义,onRejected)
对我来说,根据您所处的情况处理
onRejected
参数似乎已经足够好了。

您不能从
然后在bb中明确返回一个新的承诺(在适当情况下解决失败的承诺)吗?如果只是“断链”不起作用那么。。这根本不是一个链。你会想看看,如果我想实现额外的分支逻辑呢?例如,如果有
tradeData
请执行某些步骤,如果没有,请执行其他步骤?@Shamoon使用
else
@Esailija:为什么?我希望你没有在承诺链中构建一个
goto
?编辑:哎呀,我已经读过你的答案了。当然,取消自己也不是很清楚:-)@Bergi顺便说一句,在3.0中,您可以使用对象属性作为错误谓词,这样您就可以
抛出{label:“no data”}
然后抛出一个
.catch({label:“no data”},函数(e){})
稍后-但在这种情况下,我仍然更喜欢break,因为这里发生的事情应该非常直观。@Esailija:bluebird API中没有提到break