![](/img/trans.png)
[英]Make the return statement wait until everything else in the function is finished
[英]How can I make a statement wait until a previous function is finished?
我遇到了一个问题, window.open
被调用得太快,我的其他函数没有完成并在我的 onclick 函数中及时发布。
我尝试在trackData()
上设置超时,但它只是偶尔起作用,我不想设置更长的超时。
点击
{() => {
trackData();
window.open("https:google.com", "_self");
})
有任何想法吗?
编辑:以下在本地工作,但在生产时不跟踪。 如果"_self"
被替换为"_blank"
(它不能),则跟踪每次都有效
let postData = async(value) => {
await tracker({
action: value,
})
}
跟踪器只是用动作制作一个 axios 帖子
<div
className="exampleBTN"
onClick={() => {
postData("example").then(
window.open("https://google.com",
"_self")
)}
}
>
</div>
在本地,我可以看到数据进入数据库。
但是,在线它不起作用。 仅当以下任一条件为真时才有效:
我认为我的异步是错误的,所以我也尝试了以下操作:
onClick={async () => {
await postData("example").then(
window.open("google.com", "_self"))
}}
您可以在此处使用基于承诺的方法。使用aysnc
并await
。
async function trackData(){
.....
let data = awiat your code
.....
}
带有承诺的函数调用
trackData().then(res=>{
if(res ==="Success){
window.open("https:google.com", "_self")
}
})
您可以使用 .then 或 async/await 在操作导致Promise时执行此操作。 Axios 请求返回 Promise。
initiateAsynchronousAction()
.then(result => console.log(result))
.then
函数中的回调只有在异步函数执行的操作完成承诺时才会执行。
小说明:请注意,在.then()
您必须传递回调函数,而不仅仅是立即调用您想要执行的操作,即使您不打算使用结果值。 所以它将是.then(result=> console.log('Inside callback!'))
而不是.then(console.log('Inside callback!'))
Async-await 是另一种写法,它只是语法糖,这只是一种更简单的写法:
const foo = async () => {
const result = await initiateAsynchronousAction()
console.log(result)
}
一旦 Promise 被解析,变量result
才会被赋予值。 也就是说,将等待分配值。
如果 Axios 承诺未实现,您可以在第一种情况下链接.catch
或将任务封装在 try-catch 块中以捕获错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.