如何“冒泡”回调

时间:2014-06-03 11:46:22

标签: javascript jquery ajax

在我的事件处理函数中,我需要检查某个字段是否唯一。为了实现这一点,我在后端使用ajax调用函数。

从该功能中,使用回调发回数据。 此刻我有事件处理程序:

self.searchKeyboardCmd = function (data, event) {
        if (event.keyCode == 13) { 

            foo(function (callback) {
              if(!callback){
                return false // Returning only from this method. Not parent method
               }
            });

            var a = new Eq();
            a.StorageId(self.StorageTemp());
            a.StartDate(self.StartDateTemp());
            a.DeviceSerialNumber(self.Test());
            a.DeviceId(self.DeviceTemp());
            a.Issue(self.Issue())
            a.IssueDesc(self.IssueDesc());
            a.Quantity(self.number());
            a.Project(self.Project());
            a.MeUser(self.MeUser());

            self.data.push(a);
            $('.datepicker').datepicker({ autoclose: true, todayHighlight: true/*, language: "pl"*/, format: 'dd/mm/yyyy' });
            self.Test("");
            return false;
        }
        return true;
    };

在行中:

foo(function (callback) {
    alert(callback);
});

我用ajax调用调用此方法:

function foo(callback) {
    $.ajax({
        url: "/DeviceInstance/IsUnique",
        contentType: "application/json; charset=utf-8",
        type: "POST",
        datatype: "json",
        data: JSON.stringify({ value: viewModel.Test() }),
        error: function (data) {
            alert("Dodanie  nie powiodło się " + data);
        },
        success: function (data) {
            callback(data);
        }
    });
}

此时,主方法中foo收到正确的数据。但我需要让searchKeyboardCmd知道Ajax调用中回调值的值。我在其他问题中读到,我需要searchKeyboardCmd接受foo来电回电。

请网上发送给我How do I return the response from an asynchronous call?的问题。我整天都在阅读这个话题但仍然一无所获

2 个答案:

答案 0 :(得分:1)

如果将所有依赖回调的代码返回到回调中会怎样?

foo(function (callback) {
    if(callback) { // Changed this condition
        var a = new Eq();
        a.StorageId(self.StorageTemp());
        a.StartDate(self.StartDateTemp());
        a.DeviceSerialNumber(self.Test());
        a.DeviceId(self.DeviceTemp());
        a.Issue(self.Issue())
        a.IssueDesc(self.IssueDesc());
        a.Quantity(self.number());
        a.Project(self.Project());
        a.MeUser(self.MeUser());

        self.data.push(a);
        $('.datepicker').datepicker({ autoclose: true, todayHighlight: true/*, language: "pl"*/, format: 'dd/mm/yyyy' });
        self.Test("");
    }
});

答案 1 :(得分:1)

只是一个想法 - 这是jQuery的方式。这是你的功能:

function foo(callback) {
    return $.ajax({
        url: "/DeviceInstance/IsUnique",
        contentType: "application/json; charset=utf-8",
        type: "POST",
        datatype: "json",
        data: JSON.stringify({ value: viewModel.Test() }),
        error: function (data) {
            alert("Dodanie  nie powiodło się " + data);
        },
        success: function (data) {
            callback(data);
        }
    });
}

$ .ajax - 返回了一个Deferred对象。

这是修改后的searchKeyboardCmd函数:

self.searchKeyboardCmd = function (data, event) {
    var dfd = $.Deferred();

    if (event.keyCode == 13) {

        foo(callback).done(
            function() {
                var a = new Eq();
                a.StorageId(self.StorageTemp());
                a.StartDate(self.StartDateTemp());
                a.DeviceSerialNumber(self.Test());
                a.DeviceId(self.DeviceTemp());
                a.Issue(self.Issue())
                a.IssueDesc(self.IssueDesc());
                a.Quantity(self.number());
                a.Project(self.Project());
                a.MeUser(self.MeUser());

                self.data.push(a);
                $('.datepicker').datepicker({ autoclose: true, todayHighlight: true/*, language: "pl"*/, format: 'dd/mm/yyyy' });
                self.Test("");
                dfd.resolve();
            }
        );
    }

    dfd.reject();
};

此代码未经测试。当你编写JavaScript时,你必须异步。如果您为jsFiddle提供解决方案,我可以为您提供更多帮助。

祝你好运。