【问题标题】: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。

标签: javascript reactjs onclick


【解决方案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")
}
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多