BreezeJs - 如何同时进行 AJAX 调用?
BreezeJs - How to make simultaneous AJAX calls?
我编写了两个 Ajax 调用,它们从存储过程(在 SQL 服务器中)请求数据,sp_ahtreatmentselect
和 sp_inventoryselect
。以下是 Breeze 控制器中的功能。
[HttpPost]
[ActionName("getinventories")]
public object GetInventories(HttpRequestMessage request)
{
var data = request.Content.ReadAsFormDataAsync().Result;
var opId = data["operationid"];
string query = "sp_inventoryselect @operationId";
SqlParameter operationId = new SqlParameter("@operationId", opId);
return UnitOfWork.Context().ExecuteStoreQuery<GetInventories>(query, operationId);
}
[HttpPost]
[ActionName("gettreatments")]
public object GetTreatments(HttpRequestMessage request)
{
var data = request.Content.ReadAsFormDataAsync().Result;
var opId = data["operationid"];
string query = "sp_ahtreatmentselect @operationId";
SqlParameter operationId = new SqlParameter("@operationId", opId);
return UnitOfWork.Context().ExecuteStoreQuery<GetTreatments>(query, operationId);
}
现在,在客户端,Ajax 调用如下所示:
var ajaxImpl = breeze.config.getAdapterInstance('ajax');
function treatments(id) {
return ajaxImpl.ajax({
type: 'POST',
url: serviceName + '/gettreatments',
data: { operationid: id },
success: function(data) {
console.log('Success!');
},
error: function(error) {
console.log('Error!');
}
});
}
function inventories(id) {
return ajaxImpl.ajax({
type: 'POST',
url: serviceName + '/getinventories',
data: { operationid: id },
success: function (data) {
console.log('Success!');
},
error: function(error) {
console.log('Error!');
}
});
}
return inventories(id).then(treatments(id))
.then(function() {
// Do something
})
.fail(function(error) {
// Display error
});
两个 Ajax 调用都工作正常,但问题是,// Do something
是 运行,然后 inventories(id)
和 treatments(id)
是 运行。我希望它以相反的方式工作。我也尝试了 $.when(inventories(id), treatments(id)).then(...)
和 $.when(ajaxImpl.ajax(...), ajaxImpl.ajax(...)).then(...)
,但同样的问题出现了。我该如何解决?
提前致谢。
我不知道这和Breeze有什么关系。您的 ajaxImpl
是从 Breeze ajax 适配器获得的吗?我查看了 Breeze 随附的 ajax 适配器和 两者都没有 returns anything 来自对 ajax
方法!
因此,您的表达式在到达 return inventories(id).then(...
中的 .then
时应该立即因引用错误而终止。我根本不明白它是怎么达到 \ do something
的。
你提出这个问题的方式有些不对。
一旦你超越了这个,我仍然不明白这涉及到什么 Breeze。 Breeze 不会对您的服务请求结果做任何处理。
我对你的问题一头雾水。
我意识到问题出在同步调用上,而不是 Breeze。我使用 queue.js 进行了 Ajax 调用,然后 // Do something
调用完成了。方法如下。
var ajaxImpl = breeze.config.getAdapterInstance('ajax'),
serviceName = 'some/service',
id = 1; // Could be any number
return queue()
.defer(function(callback) {
ajaxImpl.ajax({
type: 'POST',
url: serviceName + '/getinventories',
data: { operationid: id },
success: function (data) {
console.log('Success!');
callback(null, data);
});
})
.defer(function(callback) {
ajaxImpl.ajax({
type: 'POST',
url: serviceName + '/gettreatments',
data: { operationid: id },
success: function (data) {
console.log('Success!');
callback(null, data);
});
})
.awaitAll(function(error, results) {
if (error) {
console.log('Error! ' + error);
} else {
// Do something, given that:
// results[0] are inventories, and
// results[1] are treatments
}
});
我编写了两个 Ajax 调用,它们从存储过程(在 SQL 服务器中)请求数据,sp_ahtreatmentselect
和 sp_inventoryselect
。以下是 Breeze 控制器中的功能。
[HttpPost]
[ActionName("getinventories")]
public object GetInventories(HttpRequestMessage request)
{
var data = request.Content.ReadAsFormDataAsync().Result;
var opId = data["operationid"];
string query = "sp_inventoryselect @operationId";
SqlParameter operationId = new SqlParameter("@operationId", opId);
return UnitOfWork.Context().ExecuteStoreQuery<GetInventories>(query, operationId);
}
[HttpPost]
[ActionName("gettreatments")]
public object GetTreatments(HttpRequestMessage request)
{
var data = request.Content.ReadAsFormDataAsync().Result;
var opId = data["operationid"];
string query = "sp_ahtreatmentselect @operationId";
SqlParameter operationId = new SqlParameter("@operationId", opId);
return UnitOfWork.Context().ExecuteStoreQuery<GetTreatments>(query, operationId);
}
现在,在客户端,Ajax 调用如下所示:
var ajaxImpl = breeze.config.getAdapterInstance('ajax');
function treatments(id) {
return ajaxImpl.ajax({
type: 'POST',
url: serviceName + '/gettreatments',
data: { operationid: id },
success: function(data) {
console.log('Success!');
},
error: function(error) {
console.log('Error!');
}
});
}
function inventories(id) {
return ajaxImpl.ajax({
type: 'POST',
url: serviceName + '/getinventories',
data: { operationid: id },
success: function (data) {
console.log('Success!');
},
error: function(error) {
console.log('Error!');
}
});
}
return inventories(id).then(treatments(id))
.then(function() {
// Do something
})
.fail(function(error) {
// Display error
});
两个 Ajax 调用都工作正常,但问题是,// Do something
是 运行,然后 inventories(id)
和 treatments(id)
是 运行。我希望它以相反的方式工作。我也尝试了 $.when(inventories(id), treatments(id)).then(...)
和 $.when(ajaxImpl.ajax(...), ajaxImpl.ajax(...)).then(...)
,但同样的问题出现了。我该如何解决?
提前致谢。
我不知道这和Breeze有什么关系。您的 ajaxImpl
是从 Breeze ajax 适配器获得的吗?我查看了 Breeze 随附的 ajax 适配器和 两者都没有 returns anything 来自对 ajax
方法!
因此,您的表达式在到达 return inventories(id).then(...
中的 .then
时应该立即因引用错误而终止。我根本不明白它是怎么达到 \ do something
的。
你提出这个问题的方式有些不对。
一旦你超越了这个,我仍然不明白这涉及到什么 Breeze。 Breeze 不会对您的服务请求结果做任何处理。
我对你的问题一头雾水。
我意识到问题出在同步调用上,而不是 Breeze。我使用 queue.js 进行了 Ajax 调用,然后 // Do something
调用完成了。方法如下。
var ajaxImpl = breeze.config.getAdapterInstance('ajax'),
serviceName = 'some/service',
id = 1; // Could be any number
return queue()
.defer(function(callback) {
ajaxImpl.ajax({
type: 'POST',
url: serviceName + '/getinventories',
data: { operationid: id },
success: function (data) {
console.log('Success!');
callback(null, data);
});
})
.defer(function(callback) {
ajaxImpl.ajax({
type: 'POST',
url: serviceName + '/gettreatments',
data: { operationid: id },
success: function (data) {
console.log('Success!');
callback(null, data);
});
})
.awaitAll(function(error, results) {
if (error) {
console.log('Error! ' + error);
} else {
// Do something, given that:
// results[0] are inventories, and
// results[1] are treatments
}
});