【发布时间】:2009-12-01 19:25:13
【问题描述】:
注意:对于下面的伪代码数量感到抱歉,但我不知道如何显示我正在尝试的内容。实际上,在我的解决方案中管理 ajax 图标和状态的代码要多得多,但我已经将其简化以显示问题的根源。
基本上,我正在尝试在网页上创建流程循环,但我发现它非常困难。我想做的是显示交易列表。在页面顶部,我想向用户显示一个“处理所有”按钮,该按钮将一次处理每笔交易。在服务器上处理事务时,用户应该能够取消处理循环。这将简单地停止发送 NEXT 事务;很简单的取消。但是,由于 ajax 调用的异步性质,我有点挣扎。 :(
我让它在同步循环中运行良好。但是,由于同步方法的单线程特性,用户无法使用同步方法单击取消按钮。以下是我为尝试在异步循环中管理它而炮制的:
<a href="#" id="processAll">Process All</a>
<a href="#" id="cancelProcess">Cancel</a>
<table>
<tr><td><a href="#" id="processLink1">Process</a></td></tr>
<tr><td><a href="#" id="processLink2">Process</a></td></tr>
<tr><td><a href="#" id="processLink3">Process</a></td></tr>
<tr><td><a href="#" id="processLink4">Process</a></td></tr>
</table>
下面是处理上述链接的代码:
var currentId = null;
var isWaiting = false;
var userCancel = false;
$("#processAll").click(function(){
$(this).hide();
$("#cancelProcess").show();
userCancel = false;
// NOTE: this is where I think I need more logic...?
processNextTransaction();
});
$("#cancelProcess").click(function(){
$(this).hide();
$("#processAll").show();
userCancel = true;
});
$("a[id ^= processLink]").click(function(){
var id = $(this).attr("id").replace(/^processLink(/d+)$/, "$1");
doTransaction(id);
});
以下是我在上述三个委托中使用的辅助方法:
function processNextTransaction()
{
var anchorId = $("a[id ^= processLink]:first").attr("id");
var id = anchorId.replace(/^processLink(/d+)$/, "$1");
function check()
{
if (isWaiting)
setTimeout(check, 500);
else
{
if (!userCancel)
doTransaction(id);
}
}
check();
}
function doTransaction(id)
{
isWaiting = true;
currentId = id;
$.ajax({
type: "POST",
url: "/Transactions/Process/" + id,
data: {},
success: successHandler,
error: failHandler
});
}
function successHander(result)
{
// handle result...
$("#processLink" + currentId).replaceWith(result);
isWaiting = false;
}
function failHandler(result)
{
alert("Error: " + result);
$("#processLink" + currentId).replaceWith("Error!");
isWaiting = false;
}
请注意,我只致电processNextTransaction() 一次,这确实是我的主要问题。我考虑从successHandler 和failHandler 执行此操作,但这违背了 setTimeout 和 isWaiting 标志的目的,并且当用户单击单个“处理”链接以处理单个事务时还会导致其他问题。这是我第一次体验 ajax 循环场景......请帮忙! :)
在异步环境中管理进程列表的建议方法是什么?
【问题讨论】: