2014-03-28 36 views
1

我想了解jQuery.Callbacks()方法與stopOnFalse標誌:stopOnFalse標誌如何在jquery回調中工作?

function fn1(value) { 
    console.log(value); 
    return false; 
} 

function fn2(value) { 
    fn1("fn2 says: " + value); 
    return false; 
} 
var callbacks = $.Callbacks("stopOnFalse"); 
callbacks.add(fn1); 
callbacks.fire("foo"); 
callbacks.add(fn2); 
callbacks.fire("bar"); 
callbacks.remove(fn2); 
callbacks.fire("foobar"); 

在我看來這應該輸出這樣的:

/* 
output: 
foo 
fn2 says: bar 
foobar 
*/ 

但實際上,這個輸出該作爲jQuery文檔:

/* 
output: 
foo 
bar 
foobar 
*/ 

請解釋一下。

回答

1

爲了增加澄清上述聲明的,如果我們做這樣的事

function fn1(value) { 
    console.log(value); 
    return false; 
} 

function fn2(value) { 
    fn1("fn2 says: " + value);console.log("called fn2") 
    return false; 
} 

var callbacks = $.Callbacks("stopOnFalse"); 
callbacks.add(fn1); 
callbacks.fire("foo"); 
callbacks.add(fn2); 
callbacks.fire("bar"); 
callbacks.remove(fn2); 
callbacks.fire("foobar"); 

輸出將是

foo 
bar 
foobar 

爲FN2永遠不會被現在稱爲如果我們的代碼更改爲此

function fn1(value) { 
    console.log(value); 
    return true; 
} 

function fn2(value) { 
    fn1("fn2 says: " + value); 
    return false; 
} 

var callbacks = $.Callbacks("stopOnFalse"); 
callbacks.add(fn1); 
callbacks.fire("foo"); 
callbacks.add(fn2); 
callbacks.fire("bar"); 
callbacks.remove(fn2); 
callbacks.fire("foobar"); 

輸出會隨着你的預期更早

foo 
bar 
fn2 says: bar 
foobar 

,因爲第二次FN2被調用.hope有幫助。

2

因爲自FN第一次添加,它被稱爲第一,因爲它返回的回調虛假其餘的被忽略 - 因此,FN2從未被稱爲

function fn1(value) { 
    console.log('fn', value); 
    return false; 
} 

function fn2(value) { 
    fn1("fn2", value); 
    return false; 
} 
var callbacks = $.Callbacks("stopOnFalse"); 
callbacks.add(fn1); 
callbacks.fire("foo"); 
callbacks.add(fn2); 
callbacks.fire("bar"); 
callbacks.remove(fn2); 
callbacks.fire("foobar"); 

演示:Fiddle

+0

但返回false被添加到fn2並且回調函數必須檢查這個,並且只返回stopOnFalse然後才停止它。嗯混亂了很多...... –

+0

我認爲一旦回調返回錯誤'stopOnFalse'標誌停止執行休息 –