gpt4 book ai didi

javascript - 在提交表单之前等待异步调用完成

转载 作者:行者123 更新时间:2023-11-28 05:13:49 25 4
gpt4 key购买 nike

这个有点棘手。

这是我的 jQuery 代码:

/**
* Updating websites
*/
$('.website').on('blur', function () {
var websiteId = this.id;
console.log(websiteId);
var website = this.value;
console.log(website);
fetch(`/api/edit/${websiteId}&${website}`).then(() => {

});
})

这是我的 HTML

<form method="post">
<% for(let i = 0; i < websites.length; i++){ let website = websites[i]; %>
<fieldset id="site<%= i %>">
<p style="color: <% if(errorMsgs[i] === 'Wrong website address'){ %> red;<% } else { %> green;<% } %>
padding-bottom: 0;
padding-top: 10px;
margin-bottom: 0;"
class="">
<%= errorMsgs[i] %>
</p>
<div class="">
<input class="website"
name="website<%= i %>"
id="<%= i %>"
value="<%= website %>"
type="text"/>
<a href="/websites/edit/<%= i %>"
class="btn btn-info hide">
Edit
</a>
<a href="/websites/delete/<%= i %>"
data-id="<%= i %>"
class="btn btn-danger confirmation removeBtn">
Remove
</a>
</div>
</fieldset>
<% } %>
<button type="submit"
class="btn btn-primary col-sm-offset-2"
value="Generate a report"
name="generateReport"
data-toggle="modal"
data-target="#exampleModal">
Generate a report
</button>
<!-- Save button created using Javascript. In case JS is disabled -->
</form>

这是我的 API

// GET: api/edit/_id - save updates
router.get('/edit/:_id&:url', (req, res, next) => {
Account.findById(req.user._id, (err, acc) => {
if (err) {
console.log(err);
} else {
acc.websites.set(req.params._id, req.params.url);
acc.save((err, webs) => {
if (err) {
console.log(err);
} else {
console.log('all good');
// res.redirect('/reports');
res.json(webs);
}
});
}
});
});

工作原理:用户将值输入输入字段,在模糊时,我对 API 进行 AJAX 调用,该值保存在数据库中。所有这些都有效。

不过有一个问题。如果用户点击提交按钮,提取就没有时间运行。这是有道理的。

但是我需要等到值更新后才提交。我正在考虑做类似的事情,添加一个 preventDefault到提交按钮,然后在保存后删除 preventDefault .

但我不知道该怎么做,这是个好主意还是有意义。

回顾一下:我需要等到 AJAX 调用完成后才提交表单。

<% smth %>只是 EJS模板系统。不应影响一切的运作方式。

最佳答案

看起来 fetch() 返回了一个 promise 。将这些 promise 保存在共享变量中。在您的提交按钮代码中,使用 Promise.all() 等待所有 promise 完成。像这样的东西:

const fetchPromises = [];
$('.website').on('blur', function () {
var websiteId = this.id;
console.log(websiteId);
var website = this.value;
console.log(website);
var fetchPromise = fetch(`/api/edit/${websiteId}&${website}`).then(() => {

});
fetchPromises.push(fetchPromise);
});
$('form').on('submit', function (e) {
e.preventDefault();
Promise.all(fetchPromises).then(() => this.submit());
});

您可能想要添加一些错误处理。如果您的任何 fetch() 调用失败,表单将无法提交。理想情况下,失败的 AJAX 调用会导致向用户发送一些消息,一旦取消,就会从 fetchPromises 数组中删除 promise ,并且在取消之前,提交按钮应该被禁用(实际上是可见的) ).

关于javascript - 在提交表单之前等待异步调用完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236020/

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