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

时间:2015-03-12 18:59:25

标签: ajax stored-procedures breeze

我写了两个Ajax调用,它们从存储过程(在SQL Server中),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(...),但同样的问题也出现了。我该如何解决这个问题?

提前致谢。

2 个答案:

答案 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不会对您的服务请求结果做任何事情。

我对你的问题完全不知所措。