Javascript 使用jquerypromise模拟同步调用
我一直在使用库,它是异步运行的,但我需要以同步方式使用它(例如,在提交表单之前设置一个“确认”窗口) 我不想使用Javascript 使用jquerypromise模拟同步调用,javascript,jquery,promise,Javascript,Jquery,Promise,我一直在使用库,它是异步运行的,但我需要以同步方式使用它(例如,在提交表单之前设置一个“确认”窗口) 我不想使用e.preventDefault()取消事件,我想推迟操作,直到用户响应模式。目前库不支持它,但我很好奇是否可以通过使用承诺来模拟同步行为 下面是一个非常基本的示例,使用链接(而不是表单提交按钮,这是我的最终目标): 不,这根本不是承诺所做的。承诺在这里帮不了你 链接的默认操作是导航到其他页面(或转到此页面中的某个部分)。如果要阻止链接执行其操作,则必须使用e.preventDefau
e.preventDefault()
取消事件,我想推迟操作,直到用户响应模式。目前库不支持它,但我很好奇是否可以通过使用承诺来模拟同步行为
下面是一个非常基本的示例,使用链接(而不是表单提交按钮,这是我的最终目标):
不,这根本不是承诺所做的。承诺在这里帮不了你 链接的默认操作是导航到其他页面(或转到此页面中的某个部分)。如果要阻止链接执行其操作,则必须使用
e.preventDefault()
或从onclick
处理程序返回false(最好是前者)
preventDefault
正是您所需要的,而且听起来与您的目标一模一样
但是确认有效吗?!
是的,没有人真正知道为什么阻塞是确认
提示
和警报
的原始行为,并且它从未因向后兼容性而更改。它完全阻塞,启动时不会发生任何事情-这与语言和其他API不同,并且非常不寻常。-例如:
setTimeout(function(){
alert("World");
},100);
alert("Hello");
在这里,“World”
在您关闭“Hello”框之前不会被删除,即使它只有100毫秒的超时时间<代码>警报和提示只是“冻结”JavaScript执行。它们被认为是糟糕的用户体验,除了非常具体的问题外,通常是一个糟糕的选择
那么什么是承诺?
承诺是对延迟计算的一种抽象,它允许您创建异步代码,看起来像是同步的,这非常棒,但它们并不神奇,也不会将代码变成真正的同步。所有的承诺都是让编写异步代码几乎和编写同步代码一样简单。我也遇到了同样的问题,我发现一个解决方案是使用隐藏按钮:
<button id="submit" type="submit" style="display:none;">x</button>
<button id="send_submit" type="button">y</button>
这不是一个漂亮的方法,但它的工作方式和你想的一样,另一种方式就像你说的,使用PrevendFault on事件,一个接一个地捕获所有传入的数据以发送它们 我在使用Bootbox时也遇到了这个问题。我就是这样解决的
请查看此删除表单:
<form action="route/to/action" method="POST">
<!-- these two instructions depend on your framework -->
@method('DELETE')
@csrf
<!-- The submit button in the form, change it to type="button". -->
<!-- This prevent the form submission without the user's confirmation. -->
<button type="button" id="delete" title="Delete element">
Delete
</button>
</form>
我认为你这样做是应该这样做的。你的意思是它很难看,因为你使用的是对话框而不是html?@weeknie-哪种方式?我使用第一个链接的方式,不需要等待模式——这就是我认为promises可以帮助模拟第二个链接的同步性的地方。你可以做的是,不使用提交表单,直接使用模式,当用户单击“确认”时然后,您可以捕获数据并对其执行所需操作。或者你可以看看这个答案:有趣——你建议让页面上的按钮/链接/任何元素调用模态,然后在模态中让OK/Yes按钮包含实际事件?我想我必须创建一个自定义对话框才能这样做,这就是为什么我希望使用承诺或其他方式来延迟默认操作。好的--表单提交请求附带了很多参数。有没有办法抓取这个复杂的操作(可能是从e
)并“保存”它以备将来使用?@pennstatephil您可以自己在表单上调用submit()
document.getElementById(“yourFormId”).submit()
:)submit按钮上有一个参数(例如,表单上的多次提交是“保存”还是“提交”),但我想我可以获取该参数,稍后将其放入请求中。感谢您的回复。您还可以使用闭包并将该代码放入请求中-这没有什么害处。这里的问题是preventDefault()是一个同步调用,提交带有模式确认的表单是异步的。我以前使用过这种方法,但它不适用于我在同事网站上遇到的特定情况:
<form action="route/to/action" method="POST">
<!-- these two instructions depend on your framework -->
@method('DELETE')
@csrf
<!-- The submit button in the form, change it to type="button". -->
<!-- This prevent the form submission without the user's confirmation. -->
<button type="button" id="delete" title="Delete element">
Delete
</button>
</form>
let deleteButton = document.getElementById('delete');
deleteButton.addEventListener('click', (ev) => {
bootbox.confirm('Delete this element?', (confirma) => {
if (confirma) {
return $(ev.target)[0].form.submit();
}
})
});