Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用jquerypromise模拟同步调用_Javascript_Jquery_Promise - Fatal编程技术网

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(); 
      }
    })
  });