div仅在调试

时间:2015-09-28 07:23:54

标签: javascript jquery html knockout.js

我得到了一段让我疯狂的代码。 我从服务器加载一些数据需要一些时间,因此我想显示一个" 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":假} ,. ...]

2 个答案:

答案 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