等待不执行回调且不返回promise的异步函数,而无需更改其他函数即可执行

时间:2019-06-13 14:29:39

标签: javascript asynchronous

我目前正在尝试向使用JavaScript编写的现有网络应用添加一些功能。我的问题是我想调用一个函数,该函数再次调用一些异步函数,并且我想在不执行所有其他函数之前执行一个函数。

我正在调用的函数不会进行回调,也不会返回Promise(当然这是非常糟糕的做法)。

我可以重构现有的函数,以便我正在调用的函数返回一个Promise,但这将需要大量的时间和精力。

因此,对我来说,理想的解决方案是一种技术,它允许我等待已调用的函数,然后再执行该函数再次调用的所有函数。

另一个可以接受的选项是一种技术,它允许我在所有异步函数都执行完之后执行一个函数。

因此,将其转移到一个简单的示例,我想在执行功能doSomethingAsync之后执行一个功能,而不更改此功能。

var doSomethingAsync = () => {
  setTimeout(() => { console.log("do Something Async") }, 1000);
};
// do something after doSomethingAsync has been executed ...

我尝试使用setTimeout()和零毫秒函数,但是由于它在doSomethingAsync函数之前执行,因此不起作用,在这个简单的示例中我知道这一点。

有很多选项可以在doSomethingAsync之后执行某些操作,但是我需要一种技术,使我可以在doSomethingAsync之后执行某些操作而无需更改此功能。

任何提示都非常感谢。

3 个答案:

答案 0 :(得分:1)

不更改doSomethingAsync,就无法实现所需的目标。该函数立即完成,无法检测到setTimeout何时完成。除非您能找到其他需要监视的副作用,否则您很不幸。

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

答案 1 :(得分:0)

您似乎正在寻找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")
}

答案 2 :(得分:0)

您可以将上述功能更改为

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);