1

我知道这是基本的,但是在查看了多个资源(像这样)之后,我被卡住了。如何嵌套functionTwo以使其仅在functionOne完成后运行?这是我的尝试。(实际上我想在functionTwo中做一些更复杂的事情,我只是为了简化这个测试用例。)

$(function () {
    functionOne();
});

function functionOne() {
    $(".foo:first").attr('id','bar');
    functionTwo();
}

function functionTwo() {
    console.log($('.foo:first').attr('id'));     // log the new id: 'bar'
}

小提琴

这行得通,但它们是独立运行的吗?当我在第一个函数上设置超时时,没有任何记录(除非这是一个单独的错误)。

然后我尝试了这个:

$(function () {
    functionOne();
});

function functionOne() {
    $(".foo:first").attr('id', 'bar', function () {
            functionTwo();
        });
    }

function functionTwo() {
    console.log($('.foo:first').attr('id'));
}

小提琴

没有任何记录。如果回调不能作为参数.attr

然后:

  $(function () {
      $.when.functionOne().done(function () {
          functionTwo();
      });
  });

  function functionOne() {
      $(".foo:first").attr('id', 'bar');
  }

  function functionTwo() {
      console.log($('.foo:first').attr('id'));
  }

小提琴

没有任何记录。我不认为.when并且.done应该以这种方式使用。

那么我应该如何嵌套这些呢?

4

2 回答 2

2

第一个是去这里的路。

$(function () {
    functionOne();
});

function functionOne() {
    $(".foo:first").attr('id','bar');
    functionTwo();
}

function functionTwo() {
    console.log($('.foo:first').attr('id'));     // log the new id: 'bar'
}

.attr是同步的,所以这可以按预期工作。

在您的setTimeout示例(http://jsfiddle.net/nathanbweb/t9pAR/2/)中,您使用setTimeout不正确。

setTimeout(function functionOne() {}, 2000)

这并不像你认为的那样。这将创建一个函数,并在 2 秒后运行它。该名称functionOne仅存在于函数自己的范围内。

你可能想要这个:

$(function () {
    functionOne();
});

function functionOne() {
    setTimeout(function(){
        $(".foo:first").attr('id','bar');
        functionTwo();
    }, 2000);
}

function functionTwo() {
    console.log($('.foo:first').attr('id'));     // log the new id: 'bar'
}

演示:http: //jsfiddle.net/t9pAR/6/

于 2013-11-04T19:39:37.860 回答
1

为什么不尝试返回第二个要调用的函数。

function functionOne() {
    $(".foo:first").attr('id','bar');
    return functionTwo();
}

http://jsfiddle.net/t9pAR/5/

于 2013-11-04T19:36:21.180 回答