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