我目前正在尝试向使用JavaScript编写的现有网络应用添加一些功能。我的问题是我想调用一个函数,该函数再次调用一些异步函数,并且我想在不执行所有其他函数之前执行一个函数。
我正在调用的函数不会进行回调,也不会返回Promise(当然这是非常糟糕的做法)。
我可以重构现有的函数,以便我正在调用的函数返回一个Promise,但这将需要大量的时间和精力。
因此,对我来说,理想的解决方案是一种技术,它允许我等待已调用的函数,然后再执行该函数再次调用的所有函数。
另一个可以接受的选项是一种技术,它允许我在所有异步函数都执行完之后执行一个函数。
因此,将其转移到一个简单的示例,我想在执行功能doSomethingAsync
之后执行一个功能,而不更改此功能。
var doSomethingAsync = () => {
setTimeout(() => { console.log("do Something Async") }, 1000);
};
// do something after doSomethingAsync has been executed ...
我尝试使用setTimeout()和零毫秒函数,但是由于它在doSomethingAsync
函数之前执行,因此不起作用,在这个简单的示例中我知道这一点。
有很多选项可以在doSomethingAsync
之后执行某些操作,但是我需要一种技术,使我可以在doSomethingAsync
之后执行某些操作而无需更改此功能。
任何提示都非常感谢。
答案 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);