单击事件中的回调

时间:2014-05-09 07:03:14

标签: javascript jquery callback

我在点击事件中调用回调时遇到了一些麻烦。首先,我在每个tr上注册点击事件。

jQuery(tr).click(function (event) {
    var that = this;
    A(event, that, function () {
        var $gantt_container = $('#gantt_container'),
            gantt = ($gantt_container.data("GanttControl") || 
                      $gantt_container.data("radiantqGanttControl"));
        gantt.UpdateDatasource();
        return;
    });
});

在对A的方法调用中,我将函数作为参数传递。

var A = function (event, that, B) {
    var activity = event.currentTarget['data-grid-item'].Activity;
    if (event.target.type !== 'checkbox') {
        jQuery(':checkbox', that).trigger('click');
    }
    if (jQuery(':checkbox', that)[0].checked == false) {
        jQuery(this).removeClass('ui-selected ui-state-active');
        activity.DataSource['checkbox'] = '<input class="tandtCheckbox" entityType = "' + activity.DataSource.type + '"  status="' + activity.DataSource.status + '" name="' + activity.DataSource.name + '" projectId="' + activity.DataSource.projectId + '" type="checkbox" id="' + activity.DataSource.taskId + '" mileStone="' + activity.DataSource.mileStone + '" >';
    } else {
        activity.DataSource['checkbox'] = '<input checked class="tandtCheckbox" entityType = "' + activity.DataSource.type + '"  status="' + activity.DataSource.status + '" name="' + activity.DataSource.name + '" projectId="' + activity.DataSource.projectId + '" type="checkbox" id="' + activity.DataSource.taskId + '" mileStone="' + activity.DataSource.mileStone + '" >';
    }
    B();
    return;
};

我想执行传递的函数来表现得像回调,其中方法A不应该等待函数B返回。

但是,这并不像我预期的那样。方法调用A正在等待B返回。

我是JavaScript / callback的新手需要有关如何将函数B调用作为回调的专家建议。

2 个答案:

答案 0 :(得分:4)

你的术语有点偏,在其他逻辑完成后,假设运行回调 - 这就是这里发生的事情。你想要的是异步逻辑。

你可以分开你的逻辑:

A(event, that);
B();

function B() {
    var $gantt_container = $('#gantt_container'),
        gantt = ($gantt_container.data("GanttControl") || 
                  $gantt_container.data("radiantqGanttControl"));
    gantt.UpdateDatasource();
    return;
});

var A = function (event, that) {
    // your code...
}

或者你可以使用setTimeout强制进行并列论,尽管这有点“hacky”&#39;:

var A = function (event, that, B) {
    // your code...
    setTimeout(B, 0);
    return;
};

答案 1 :(得分:1)

您可以使用简单的setTimeout()来执行此操作,如

setTimeout(B, 0);

当您调用B()时,它是一个同步调用,执行控制将传递给B,并且只有在执行A后才会返回B。当您使用setTimeout()时,传递的B的执行将传递给计时器,该计时器将在当前执行完成时占用。

Javscript Timers