从嵌套函数返回

时间:2014-05-21 00:08:59

标签: javascript jquery

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(),因为只有在我获得成功的响应时才需要终止该功能。

3 个答案:

答案 0 :(得分: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的其余部分执行。

所以你需要更多地思考你需要做什么,并想出一个不同的方法来实现它。

答案 1 :(得分: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调用,成功回调中的return语句仍然没有做任何实质性的事情。 将函数的返回视为要分配给调用语句的值。

什么使你有必要打破你的职能?

答案 2 :(得分:0)

如果使用$ .ajax()而不是短手$ .get(),则可以指定它是同步执行的。

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

通常,当您想根据函数的返回值做出决定时,它会返回一个值,然后使用条件语句来确定接下来会发生什么。