我写了两个Ajax调用,它们从存储过程(在SQL Server中),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(...)
,但同样的问题也出现了。我该如何解决这个问题?
提前致谢。
答案 0 :(得分:1)
我意识到问题在于同步调用,而不是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
}
});
答案 1 :(得分:0)
我不知道这与Breeze有什么关系。你从Breeze ajax适配器获得了ajaxImpl
吗?我查看了Breeze附带的ajax适配器和它们都没有通过调用ajax
方法返回任何!
因此,当你到达.then
中的return inventories(id).then(...
时,你的表达应该立即死亡,并带有引用错误。我根本没有看到它如何得到\\ do something
。
你提出这个问题的方式有些不对劲。
一旦你超越了这个,我仍然不知道这是如何涉及微风的。 Breeze不会对您的服务请求结果做任何事情。
我对你的问题完全不知所措。