在我的事件处理函数中,我需要检查某个字段是否唯一。为了实现这一点,我在后端使用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?的问题。我整天都在阅读这个话题但仍然一无所获
答案 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提供解决方案,我可以为您提供更多帮助。
祝你好运。