如何让语句等到前一个函数完成?
Posted
技术标签:
【中文标题】如何让语句等到前一个函数完成?【英文标题】:How can I make a statement wait until a previous function is finished? 【发布时间】:2020-11-17 14:58:23 【问题描述】:我遇到了一个问题,即 window.open
被调用太快,而我的其他函数没有完成并在我的 onclick 函数中及时发布。
我尝试在 trackData()
上设置超时,但它只是偶尔起作用,我不想设置更长的超时。
点击
() =>
trackData();
window.open("https:google.com", "_self");
)
有什么想法吗?
编辑:以下内容在本地工作,但在生产时不跟踪。如果 "_self"
被替换为 "_blank"
(这是不可能的),则跟踪每次都有效
let postData = async(value) =>
await tracker(
action: value,
)
tracker 只是通过操作发布 axios 帖子
<div
className="exampleBTN"
onClick=() =>
postData("example").then(
window.open("https://google.com",
"_self")
)
>
</div>
在本地,我可以看到数据进入数据库。
但是,在线它不起作用。仅当其中任何一个为真时才有效:
onClick 中没有 window.open 没有“_self”而是“_blank”,因此它会在新标签页中打开我认为我的异步是错误的,所以我也尝试了以下方法:
onClick=async () =>
await postData("example").then(
window.open("google.com", "_self"))
【问题讨论】:
你能分享更多的代码吗?我们不知道 trackData 做了什么,所以我们无能为力。 @pytness,这只是一个 axios 帖子。这与问题无关(我相信无论如何)。 trackData 并不总是在打开新窗口之前完成发布。如果我从 onClick 中删除“window.open” - 它每次都会发布 axios。 【参考方案1】:当操作导致 Promise 时,您可以使用 .then 或 async/await 来执行此操作。 Axios 请求返回 Promises。
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)
变量result
只有在 Promise 解决后才会被赋予值。即等待赋值。
您可以在第一种情况下链接 .catch
或将任务封装在 try-catch 块中以在 Axios 承诺未履行时捕获错误。
【讨论】:
@UnluckyLAD 你可以在这里添加更多代码。目前尚不清楚跟踪器功能的作用。它会返回一个 Promise 吗?此外,在.then()
内部,您必须传递一个回调函数,而不是立即调用window.open()
,即使您不打算使用结果值。所以它将是.then((result)=> window.open())
【参考方案2】:
您可以在此处使用基于承诺的方法。为此请使用 aysnc
和 await
。
async function trackData()
.....
let data = awiat your code
.....
使用 promise 调用函数
trackData().then(res=>
if(res ==="Success)
window.open("https:google.com", "_self")
)
【讨论】:
以上是关于如何让语句等到前一个函数完成?的主要内容,如果未能解决你的问题,请参考以下文章