我想从内部函数内部跳出一个外部函数。
something = true
outer: (next)->
@inner (err)->
if err?
next err
#jump out of outer function here
console.log 'still in outer'
inner: (next)->
next new Error 'oops' if @something is true
代码在coffeescript中,但欢迎使用javascript答案。
更新
感谢您快速回复 - 那么如何使用@inner
函数的返回值?对于这种事情,是否存在普遍接受的模式?
something = true
outer: (next)->
return unless @inner (err)-> next err if err
console.log 'still in outer'
inner: (next)->
if @something is true
next new Error 'oops'
return false
return true
答案 0 :(得分:0)
如果要立即退出outer
的原因是发生异常情况(错误),则可以抛出异常。如果outer
没有捕获它,outer
将被终止(与outer
的调用者一样,依此类推,直到捕获异常或JS引擎本身为止)。
对于正常的程序流程,但是,在JavaScript和转换成它的各种语言中,我们不会对正常的程序流程使用异常(尤其是因为它们很昂贵)。对于那些情况,不,调用函数无法终止其调用者;它必须返回一个调用者用来知道退出的值,或者为两个范围内的变量设置一个值。
以下是您的示例已更新为使用inner
的返回值,这是执行此操作的最常用方法:
something = true
outer: (next)->
stop = @inner (err)->
if err?
next err
#jump out of outer function here
if stop
return
console.log 'still in outer'
inner: (next)->
next new Error 'oops' if @something is true
if someCondition
return true
这是您更新的示例,以使用它们都关闭的变量:
something = true
stop = false
outer: (next)->
@inner (err)->
if err?
next err
#jump out of outer function here
if stop
return
console.log 'still in outer'
inner: (next)->
next new Error 'oops' if @something is true
if someCondition
stop = true
(请原谅我的CoffeeScript,我不使用它。)