gpt4 book ai didi

html - 并行表单提交和ajax调用

转载 作者:行者123 更新时间:2023-11-28 01:54:43 24 4
gpt4 key购买 nike

我有一个在服务器上调用长请求的网页。该请求生成一个 excel 文件,并在准备就绪时将其流式传输回客户端。

通过使用 jQuery 创建表单元素并调用提交方法来调用请求。

我希望在处理请求期间向用户显示任务进度。

我想使用 jQuery ajax 调用我在服务器上返回状态消息的服务。

我的问题是,当我调用此服务(使用 $.ajax)时,回调仅在表单提交发起的请求结束时被调用。

有什么建议吗?

代码:

 <script>
function dummyFunction(){
var notificationContextId = "someid";

var url = $fdbUI.config.baseUrl() + "/Promis/GenerateExcel.aspx";

var $form = $('<form action="' + url + '" method="POST" target="_blank"></form>');
var $hidden = $("<input type='hidden' name='viewModel'/>");
$hidden.val(self.toJSON());
$hidden.appendTo($form);

var $contextId = new $("<input type='hidden' name='notifyContextId'/>").val(notificationContextId);
$contextId.appendTo($form);

$('body').append($form);

self.progressMessages([]);

$fdbUI.notificationHelper.getNotifications(notificationContextId, function (message) {
var messageText = '';
if (message.IsEnded) {
messageText = "Excel is ready to download";
} else if (message.IsError) {
messageText = "An error occured while preparing excel file. Please try again...";
} else {
messageText = message.NotifyData;
}

self.progressMessages.push(messageText);
});
$form.submit();
}
<script>

该代码使用调用 $.ajax 的实用程序库。它的代码是:

(函数(){ 如果(!window.flowdbUI){ 抛出(“缺少对 flowdb.ui.core 的引用。”);

function NotificationHelper() {
var self = this;

this.intervalId = null;

this.getNotifications = function (contextId, fnCallback) {
if ($.isFunction(fnCallback) == false)
return;

self.intervalId = setInterval(function() {
self._startNotificationPolling(contextId, fnCallback);
}, 500);

};

this._startNotificationPolling = function (contextId, fnCallback) {
if (self._processing)
return;

self._processing = true;
self._notificationPolling(contextId, function (result) {
if (result.success) {
var message = result.retVal;
if (message == null)
return;
if (message.IsEnded || message.IsError) {
clearInterval(self.intervalId);
}

fnCallback(message);
} else {
clearInterval(self.intervalId);
fnCallback({NotifyData:null, IsEnded:false, IsError:true});
}
self._processing = false;
});
};

this._notificationPolling = function (contextId, fnCallback) {
$fdbUI.core.executeAjax("NotificationProvider", { id: contextId }, function(result) {
fnCallback(result);
});
};
return this;
}

window.flowdbUI.notificationHelper = new NotificationHelper();
})();

最佳答案

默认情况下,ASP.NET 将只允许每个 session 有一个并发请求,以避免竞争条件。因此,在长轮询请求完成之前,服务器不会响应您的状态请求。

一种可能的方法是让您的表单发布立即返回,并且当状态请求显示完成时,启动一个新请求以获取它知道正在服务器上等待它的数据。

或者您可以尝试更改 EnableSessionState 设置以允许多个并发请求,如所述here .

关于html - 并行表单提交和ajax调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com