我可以在蓝鸟Promises的早期打破链条吗?

Sha*_*oon 7 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
Run Code Online (Sandbox Code Playgroud)

如果没有tradeData,我有什么方法可以中断链?

Sah*_*rav 8

虽然是一个公认的答案,但我想告诉所有googlers,"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
Run Code Online (Sandbox Code Playgroud)

在此之前,请确保在config中添加以下行:

Promise.config({
    cancellation: true
});
Run Code Online (Sandbox Code Playgroud)


Esa*_*ija 7

getFromDb().then (tradeData) ->
  if tradeData
    getLatestPrice tradeData ->
      .then (latestPrice) ->
        ...
      .then ->
        ...
      .then ->
        ...
      .catch (err) ->
        next err
  else
    getSomethingElse ->
       send("no data")
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

  • @Esailija:bluebird API中没有提到break http://bluebirdjs.com/docs/api-reference.html (3认同)
  • @Bergi偶然在3.0中你可以使用对象属性作为错误谓词,所以你可以使用`throw {label:"no data"}`然后使用`.catch({label:"no data"},function(e){} )``稍后 - 但我仍然会在这个特殊情况下更喜欢休息,因为它应该非常直观,这里发生的事情. (2认同)