使功能彼此依赖

时间:2015-03-21 23:09:19

标签: javascript jquery

我正在使用jquery,并试图让一些功能在彼此之后开火。以下是正确的。我几乎在函数中调用函数。

  $j = jQuery.noConflict();
            var obj;
            var items = new Array();


            $j(document).ready(function() {
                                
                function setTopicsSpans() {               
                    // do stuff
                    //.....
                }
                
                function ajaxGetTopicRatings() {
                    var request = $j.ajax({
                        url: "json.php",
                        type: "GET",
                        data: {"items": items},
                        cache: true,
                        contentType: 'application/json; charset=utf-8',
                    });                    
                    request.done(function(data) {
                        //console.log(data);
                        obj = jQuery.parseJSON(data);
                        setTopicsSpans();
                    });
                    //......
                }
                function setTopicsArray() {
                    $j('[data-tid]').each(function() {
                        items.push(this.getAttribute('data-tid'));
                    });
                    ajaxGetTopicRatings();
                }
                
                setTopicsArray();
                
            });

现在我读一下有关回调函数的内容。但是当我在函数ajaxGetTopicRatings(setTopicSpans)中放入例如“setTopicsSpans”时,我得到一个错误,即函数:“setTopicsSpans”不存在。任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:1)

是的,我第一次误解了这个问题。回到这里,回调:

您已经通过" request.done"进行了某种回调。方法。如果你想运行像你建议的功能,你可以这样做:

function ajaxGetTopicRatings(myCallback) {
    //code code code

    if (myCallback && typeof(myCallback) === "function") {
        myCallback();
    }
}

然后你可以打电话给...

ajaxGetTopicRatings(function () { setTopicsSpans() });

这将确保" setTopicsSpans"只有在" ajaxGetTopicRatings"中调用之后才会运行。

(确保正确输入函数名称,而不是原始问题:" ...但是当我输入例如" setTopicsSpans"在函数ajaxGetTopicRatings中(setTopicSpans)我得到一个错误的..."

在函数的末尾添加这样的回调,仍不能保证它将是最后一个运行的东西。在你的例子中,最后运行的东西很可能是" request.done()",因为代码不会等待这个。这可能是回调驻留的好地方。

我在下面的代码片段中添加了一个函数调用顺序的小例子。



function test1CB1(myCallback) {
  document.write('test1 CB1 hit<br/>');
  myCallback();
}

function test1CB2(myCallback) {
  document.write('test1 CB2 hit<br/>');
  myCallback();
}

function test1CB3() {
  document.write('test1 CB3 hit<br/><br/>');
  test2();
}

function test2CB1() {
  document.write('test2 CB1 hit<br/>');
}

function test2CB2() {
  document.write('test2 CB2 hit<br/>');
}

function test2CB3() {
  document.write('test2 CB3 hit<br/>');
}

function test2() {
  document.write('Standard behaviour - inner most function gets called first<br/>');
  test2CB1(test2CB2(test2CB3()));
}

document.write('Functions fire after each other using callbacks<br/>');
test1CB1(function() {
  test1CB2(function() {
    test1CB3();
  });
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

在我看来,你的例子在正常情况下应该可以正常工作(即没有未解决的引用)。

但我建议您改为使用$.getJSON(),或者在dataType: 'json'的选项对象参数中设置$.ajax()而不是contentType,因为您可能错误地将其中一个用于{{1}}其他在这里。