如何让语句等到前一个函数完成?

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=&gt; 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)=&gt; window.open())【参考方案2】:

您可以在此处使用基于承诺的方法。为此请使用 aysncawait

async function trackData()
 ..... 
   let data = awiat your code 
.....

使用 promise 调用函数

trackData().then(res=>
  if(res ==="Success)
 window.open("https:google.com", "_self")

)

【讨论】:

以上是关于如何让语句等到前一个函数完成?的主要内容,如果未能解决你的问题,请参考以下文章

如何让函数等到动画完成?

如何让 android 应用程序等到电话完成?

如何结合这两个功能,让一个等到它完成,然后运行另一个

C#如何让函数等到完成某件事?

如何让加载活动等到线程完成

如何让python脚本等到下载完成