Javascript Async Await 等待两个函数完成
2020-11-14
1158
我很难理解 async/await。
我有以下代码调用:
-
submitHandler()
将表单的输入发布到 Google 表格
const scriptURL =
'GOOGLE SCRIPT URL'
const form = document.forms.emailform
fetch(scriptURL, { method: 'POST', body: new FormData(form) })
.then(response => {
console.log('Success!', response)
setFormSuccess(1)
})
.catch(error => {
console.error('Error!', error.message)
setFormSuccess(2)
})
}
-
childRef.current.upload()
将文件发布到 S3...
但我需要等待这两个函数的结果,然后才能调用另一个函数来打开模式并传入这两个函数的结果。
有人能帮帮我吗?
非常感谢
async function onSubmit() {
setTimeout(() => {
submitHandler()
childRef.current.upload()
}, 1000)
}
//I want to wait for onSubmit to complete and then call another function which sets state and then launches a modal
编辑:我忘了在原始问题中提到,我已经在我调用的所有函数中尝试了 await,但它们都不起作用
3个回答
我认为您只是缺少一些“await”语句。我还修改了超时。
async function onSubmit() {
let sleep = function (ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
await sleep(1000)
await submitHandler()
await childRef.current.upload()
}
//I want to wait for onSubmit to complete and then call another function which sets state and then launches a modal
此外,在 submitHandler() 中,您没有正确使用 async-await。您正在使用 .then 方法,该方法无法轻松与 await 结合使用。
async submitHandler() {
const scriptURL = 'GOOGLE SCRIPT URL'
const form = document.forms.emailform
try {
let response = await fetch(scriptURL, { method: 'POST', body: new FormData(form) })
console.log('Success!', response)
setFormSuccess(1)
} catch(error) {
console.error('Error!', error.message)
setFormSuccess(2)
}
}
如果您仍想捕获错误,则必须将提取包装在 try 块中。
Kevin Kreps
2020-11-14
您可以使用 Promise.all() 来等待多个 Promises,就像这样
const result = await Promise.all([submitHandler(), childRef.current.upload()]);
Riwen
2020-11-14
首先,如果您想在
await
内部使用
setTimeout
,则需要将回调标记为
async
。
但是
setTimeout
使用回调,因此偏离了您想要的控制流。因此,我将使用一个简单的承诺包装器来实现它:
const promiseSetTimeout = (cb, delay) => new Promise((resolve, reject) => {
setTimeout(async () => {
const ret = await cb();
resolve(ret);
}, delay);
});
因此,您可以等待它并获得所需的控制流。
function onSubmit() {
return promiseSetTimeout(async () => {
await submitHandler();
await childRef.current.upload();
}, 1000);
}
Vivick
2020-11-14