我得到了一段让我疯狂的代码。 我从服务器加载一些数据需要一些时间,因此我想显示一个" loading-icon"。但是图标没有显示,所以我在Chrome中调试了代码然后它正在运行。
$(".k-loading-mask").show();
//loading the data from the server
var purchaseInvoiceItems = getOpenPurchaseInvoiceItems(id);
viewmodel.Items = ko.mapping.fromJS(purchaseInvoiceItems, {}, viewmodel.Items);
var prepaymentableOrders = getPrepaymentableOrders(id);
viewmodel.PrepaymentableOrders = ko.mapping.fromJS(prepaymentableOrders, {}, viewmodel.PrepaymentableOrders);
//loading done... hide the loading-icon.
$("div.k-loading-mask").hide();
修改
function getOpenPurchaseInvoiceItems(id) {
var result = jQuery.ajax({
url: '/purchaseinvoices/getopenpurchaseinvoiceitems',
data: JSON.stringify({ supplierId: id }),
async: false,
type: 'POST',
contentType: "application/json"
});
var json = result.responseText;
var purchaseInvoiceItems = eval("(" + json + ")");
return purchaseInvoiceItems;
}
function getPrepaymentableOrders(id) {
var result = jQuery.ajax({
url: '/purchaseinvoices/getprepaymentableorders',
data: JSON.stringify({ supplierId: id }),
async: false,
type: 'POST',
contentType: "application/json"
});
var json = result.responseText;
var purchaseInvoiceItems = eval("(" + json + ")");
return purchaseInvoiceItems;
}
EDIT2
在重构了对异步ajax的调用后,我遇到了问题,done()
的{{1}}从未被调用过。当我直接调用函数时,会调用getOpenPurchaseInvoiceItems
的{{1}}。
但Chrome Networkanalysis告诉我网络交易在约3秒后完成。
Maris的回答对我来说也不起作用,done()
永远不会被调用。
getPrepaymentableOrders
编辑3 添加了一个错误回调,它实际上被触发了。
状态200
statusText OK
responseText(结果项的Json)
我不安静地知道结果出错的原因......
趣味-情况: 这是有效的,似乎我的前任有同样的问题,因为这段代码是我的前任代码的修改版本。
done()
好像结果无法直接解析?!
提琴手回复
HTTP / 1.1 200 OK
服务器:ASP.NET Development Server / 11.0.0.0
日期:星期一,2015年9月28日11:29:15 GMT
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:3.0
Cache-Control:private,s-maxage = 0
Content-Type:application / json;字符集= UTF-8
内容长度:126537
连接:关闭[{" GoodsReceiptItemId":311360," PurchaseOrderNumber":" BE0010018"" SupplierProductNumber":" 205.00-122& #34;" ProductNumber":" 205.00-122"" SupplierDeliveryNumber":" 5503"" GoodsReceiptDate" :新日期(1442527200000),"描述":" 001-4631-00,\" LA-EE \""," ShouldBePayed&# 34;:假,"量":500.00000"价格":2.66000" PriceUnit":1.00000" TotalPrice":1330.00000,& #34; PurchaseOrderId":309360,"产品编号":4792," GoodsReceiptId":299080,"标识":0," HasBeenSaved&#34 ;:假,"错误" {"错误":[]," HasAnyError":假," HasSumError":假} ,. ...]
答案 0 :(得分:2)
由于在javascript中只有一个线程并且您正在对api运行同步调用,因此UI会在请求完成之前被冻结。这就是为什么你根本看不到装载栏的原因。因此,您必须使用异步调用和承诺来实现您想要的目标。
下一个代码应该有用。
function getOpenPurchaseInvoiceItems(id) {
return $.post('/purchaseinvoices/getopenpurchaseinvoiceitems', { supplierId: id });
}
function getPrepaymentableOrders(id) {
return $.post('/purchaseinvoices/getprepaymentableorders', { supplierId: id });
}
$(".k-loading-mask").show();
//loading the data from the server
var purchaseInvoiceItemsPromise = getOpenPurchaseInvoiceItems(id);
var prepaymentableOrdersPromise = getPrepaymentableOrders(id);
$.when(purchaseInvoiceItemsPromise, prepaymentableOrdersPromise ).done(function(purchaseInvoiceItems, prepaymentableOrders){
viewmodel.Items = ko.mapping.fromJS(purchaseInvoiceItems, {}, viewmodel.Items);
viewmodel.PrepaymentableOrders = ko.mapping.fromJS(prepaymentableOrders, {}, viewmodel.PrepaymentableOrders);
$("div.k-loading-mask").hide();
})
永远不要使用同步ajax调用。如果您出于某种原因想要使用同步调用,那么您肯定会做错事。
答案 1 :(得分:1)
尝试使用异步调用,如下所示:
jQuery.ajax({
url: '/purchaseinvoices/getopenpurchaseinvoiceitems',
data: JSON.stringify({ supplierId: id }),
type: 'POST',
contentType: "application/json"
}).done(function(purchaseInvoiceItems){
//.....
})
PS:永远不要使用“eval”。如果你正在获得JSON,并且标题说它是JSON,那么jquery足够聪明,可以将结果转换为实际对象。 但是,如果需要将JSON字符串转换为object,请使用JSON.parse