2014-05-21 172 views
1
function outer() { 
    $(['hi', 'there']).each(function(idx, e) { 
     console.log(e); 
     return; 
    }); 
    alert("I don't want to be called"); 
} 

function outer() {  
    $.get('http://test.com', function (data) { 
     console.log(data) 
     return; // I want to terminate the entire outer() function here. 
    }); 
    alert("I don't want to be called"); 
} 

什麼是在這種情況下突破嵌套函數的約定?當使用for循環時,在它們內部返回會終止包含它們的整個函數。然而,因爲$.each()是一個單獨的函數調用,所以從它返回的只是自己而不是外部函數。我可以簡單地return兩次,一旦進入內部,一次在外面,但我不知道我將如何處理$.ajax(),因爲只有當我獲得成功的響應時才需要終止函數。從嵌套函數返回

+0

我不完全確定,但嘗試'返回false;' – Sheraff

+0

你不能這樣做,因爲ajax的異步性質 –

+0

簡短的回答:你不能。在第一個例子中可以有一個解決方法,但是'$ .get'是異步的,並且'outer'將在內部函數被調用之前返回。 –

回答

1

下面是它是如何工作的摘要。

。每()

return true; // skips to the next iteration of .each() 
return false; // exits the .each() loop 

總之沒有爆發在單個語句中包含.each()功能的方式。

$獲得()

return [true|false]; // makes no sense at all. 

$.get()回報沒有得到執行,直到Ajax調用完成後,它不會起到太大的目的。即使你進行同步ajax調用,成功回調中的返回語句仍然不會做任何實質性的事情。 將函數返回爲要分配給調用語句的值。

什麼使有必要擺脫你的職責?

1

對於$.each(),您可以在回調中停止迭代return false;,如jQuery documentation中所述。

這將不會從調用函數返回,但您可以設置一個標誌,並在外部功能測試。

如果你想要一個簡單的方法來從循環內外部函數返回,你用一個簡單的循環for更好:

var array = [ 'hi', 'there' ]; 
for(var i = 0; i < array.length; ++i) { 
    var e = array[i]; 
    console.log(e); 
    return; 
} 
alert("I don't want to be called"); 

對於$.get(),你應該有些console.log()呼叫添加到您的代碼並觀察它們被調用的順序:

function outer() { 
    console.log('in outer before $.get is called'); 
    $.get('http://test.com', function (data) { 
     console.log('inside $.get callback'); 
    }); 
    console.log('in outer after $.get returns'); 
} 

現在你會發現什麼是日誌消息的順序:

in outer before $.get is called 
in outer after $.get returns 
inside $.get callback 

見回調是怎麼過去的事情?outer函數完成後,它被稱爲。因此,此回調無法阻止outer的其餘部分執行。

所以,你需要考慮一些你需要做的,並找出一種不同的方式來完成它的。

+0

嗨邁克爾。謝謝!我檢查了文檔,看起來不可能打破外層函數,因爲'return false'只是終止'$ .each()'函數。 –

+0

是的,我誤解了你所問的,對不起!你應該使用一個簡單的'for'循環代替'$ .each()'來簡化操作。我更新了答案...... –

0

如果使用$阿賈克斯(),而不是短期的手和$ .get(),它可以指定它可以同步執行。

$.ajax({ 
    url: 'http://test.com', 
    success: function (data) { 
    }, 
    async: false 
}); 

通常,當你想基於你擁有它返回一個值,然後使用條件語句來確定接下來會發生什麼函數的返回值決定。

+0

'async:false'有一些非常不好的後果。在某些瀏覽器中,如果您的服務器速度較慢或無法響應,則不僅會鎖定當前瀏覽器選項卡/窗口,而且會鎖定所有瀏覽器窗口。建議僅作爲最後的手段 - 編寫正確的異步代碼要好得多。 –