【发布时间】:2020-07-29 15:12:04
【问题描述】:
我有一个表单来监听名为onBeforeSubmit 的事件。当我提交表单时会触发此事件,但如果回调返回false,则会停止提交。
问题
我的回调涉及对 API 的异步调用。在决定是否返回 false 之前,如何强制事件等待承诺解决?目前它不会等待fetch() 解决 - 我已经尝试了async/await 和.then() 方法......
我尝试了什么:
尝试 1:
onBeforeSubmit: async (e) {
const res = await fetch(url);
// if res value fails some condition
return false
}
尝试 2:
onBeforeSubmit: (e) {
fetch(url).then( res => {
// if res value fails some condition
return false
})
}
await 不应该强制 javascript 等到 fetch 解决后再继续下一行吗?
我还注意到,每当我输入 async 关键字时,它都会忽略 return false 语句并继续提交。是什么原因造成的?
编辑:这是第 3 方 API,所以我无法控制 onBeforeSubmit 的行为方式:(
【问题讨论】:
-
不,
async总是返回一个承诺。要访问false,调用者需要等待承诺解决。您能否提供更多上下文并稍微修饰一下示例 - 接收return false值的函数是否在您的控制之下? -
是什么让您认为您的代码没有等待 fetch 返回的承诺解决?
-
嗨@ggorlen,感谢您的回复 - 不幸的是,它来自第 3 方 API,所以我无法控制它。我希望找到一种方法让它接受承诺。
-
@NickParsons 目前,即使在
.then中使用return语句,表单也会被提交。据我了解,包装函数仅在.then内返回。不过好像我理解错了。 -
这可能是因为调用者将 promise 视为真的:
console.log(!!new Promise(res => res))打印为 true。
标签: javascript asynchronous promise async-await dom-events