我正在使用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”不存在。有人知道如何执行此操作吗?

最佳答案

是的,我一开始就完全没读懂这个问题。回调函数:

您已经通过“ request.done”方法使用了某种回调。如果要运行建议的功能,可以执行以下操作:

function ajaxGetTopicRatings(myCallback) {
    //code code code

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


那你可以打电话给...

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


这将确保“ setTopicsSpans”在“ ajaxGetTopicRatings”中被调用之前不会运行。

(确保输入正确的函数名称,而不是原始问题:“ ...但是当我在ajaxGetTopicRatings(setTopicSpans)函数中放入例如“ setTopicsSpans”时,我得到了错误提示。”)

在函数的末尾添加这样的回调仍然不能保证它将是最后运行的事情。在您的示例中,最后运行的代码很可能是“ 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();
  });
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

09-25 15:42