我正在通过应用程序中的 Web API Controller 对 C# 进程进行 Ajax 调用。这是在 JQuery 循环中完成的。 C# 过程需要花费大量时间。当 JQuery 循环运行时,应用程序被锁定,不能用它做任何其他事情。代码如下:
this.PDFReports = function () {
var reports = JSON.parse(localStorage.getItem("reportsInfo"))
var reportPDFPaths = []
$.each(reports, function (index, r) {
//No need to render report as PDF if it is already.
if (r.TypeName != "PDF") {
var reportid = r.BOReportID
var parms = r.parms
var parmslength = Object.keys(parms).length
var parmstring = ""
for (i = 0; i < parmslength; i++) {
var parmname = parms[i].name
var parmvalue = parms[i].value
if (parmstring.length > 0) {
parmstring = parmstring + "|Name:" + parmname + "," + "Value:" + parmvalue
}
else {
parmstring = parmstring + "Name:" + parmname + "," + "Value:" + parmvalue
}
}
//Render crystal report as PDF file.
var PDFCreateUrl = "/odata/PDFReport"
PDFCreateAjaxRequest("post", PDFCreateUrl, { ReportID: reportid, ParmString: parmstring })
.done(function (result) {
reportPDFPaths.push(result.value)
})
.fail(function (jqXHR, textStatus, errorThrown) {
});
function PDFCreateAjaxRequest(type, url, data) {
var options = {
dataType: "json",
contentType: "application/json",
type: type,
data: data ? JSON.stringify(data) : null,
async: false
};
return $.ajax(url, options);
}
}
else
{
var ReportID = r.ReportID
var fullpath = localStorage.getItem("PDFServerPath" + ReportID)
reportPDFPaths.push(fullpath)
}
})
localStorage.setItem("reportPDFPaths", reportPDFPaths)
}
最佳答案
function PDFCreateAjaxRequest(type, url, data) {
var options = {
dataType: "json",
contentType: "application/json",
type: type,
data: data ? JSON.stringify(data) : null,
async: false // There's your problem
};
return $.ajax(url, options);
}
同步 XHR 将阻止执行。考虑以异步方式编写整个 PDFReports
函数,这样就可以避免 async:false
。
关于javascript - 从 Javascript 中的循环调用的缓慢 C# 进程正在锁定我的应用程序,直到它完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42861184/