为了账号安全,请及时绑定邮箱和手机立即绑定

等待异步函数,它不接受回调也不返回承诺,在不改变其他函数的情况下被执行

等待异步函数,它不接受回调也不返回承诺,在不改变其他函数的情况下被执行

青春有我 2021-06-29 18:55:50
我目前正在尝试向用 JavaScript 编写的现有 Web 应用程序添加一些功能。我的问题是我想调用一个函数,该函数再次调用一些异步函数,并且我想在执行所有其他函数之前不执行一个函数。我正在调用的函数不接受回调,也不返回承诺(这当然是非常糟糕的做法)。我可以重构现有的函数,以便我调用的函数返回一个 promise,但这需要大量的时间和精力。所以对我来说理想的解决方案是一种技术,它允许我等待我调用的函数,然后所有函数再次被该函数调用以执行。另一种可接受的选择是一种允许我在执行完所有异步函数后执行函数的技术。所以把这个转移到一个简单的例子中,我想在函数执行后执行一个函数doSomethingAsync而不改变这个函数。var doSomethingAsync = () => {  setTimeout(() => { console.log("do Something Async") }, 1000);};// do something after doSomethingAsync has been executed ...我尝试使用 setTimeout() 和零毫秒函数,但这不起作用,因为它在doSomethingAsync函数之前执行,我知道在这个简单的例子中。有很多选项可以在之后执行某些操作,doSomethingAsync但我需要一种技术,该技术允许我在doSomethingAsync不更改此功能的情况下执行某些操作。
查看完整描述

3 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

不改变就无法实现你想要的doSomethingAsync。该函数立即完成并且无法检测何时setTimeout完成。除非你能找到一些其他的副作用来监测,否则你就不走运了。

从技术上讲,在doSomethingAsync完成执行后立即执行某些操作很容易。它几乎立即完成。您不能做的是在setTimeout触发器之后执行某些操作。因为doSomethingAsync不会返回与其内部所做的任何联系。


查看完整回答
反对 回复 2021-07-01
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您似乎正在寻找await关键字。


async function waitForMe() {

    console.log("I take time to execute")

}


async function waitsForOthers() {

    console.log("I am going to print right now")

    await waitForMe() //***

    console.log("Now that that's done, I am going to print")

}


查看完整回答
反对 回复 2021-07-01
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您可以将上述功能更改为,


var doSomethingAsync = () => {

  setTimeout(() => {

    console.log("do Something Async");

    youWantToExecuteAtLast();

  }, 1000);

};

// do something after doSomethingAsync has been executed ... 


function youWantToExecuteAtLast() {

  alert("This is the end");

};


doSomethingAsync();

对于多次调用,


var counter = 0;

var doSomethingAsync = (timer) => {

  setTimeout(() => {

    console.log("do Something Async : ",(counter+1));

    counter++;

    youWantToExecuteAtLast();

  }, timer);

};

// do something after doSomethingAsync has been executed ... 


function youWantToExecuteAtLast() {

  if(counter === 3)

    alert("Three calls are done");

};


doSomethingAsync(2000);

doSomethingAsync(4000);

doSomethingAsync(6000);


查看完整回答
反对 回复 2021-07-01
  • 3 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信