2014-05-21 175 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'有一些非常不好的后果。在某些浏览器中,如果您的服务器速度较慢或无法响应,则不仅会锁定当前浏览器选项卡/窗口,而且会锁定所有浏览器窗口。建议仅作为最后的手段 - 编写正确的异步代码要好得多。 –