BreezeJs - 如何同时进行 AJAX 调用?

BreezeJs - How to make simultaneous AJAX calls?

我编写了两个 Ajax 调用,它们从存储过程(在 SQL 服务器中)请求数据,sp_ahtreatmentselectsp_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
        }
    });