在函数1已经完成之后调用函数2

Call a function2 after function1 has already finished

本文关键字:函数 之后 调用      更新时间:2023-09-26

我使用JavaScript进行编码
我有两个函数func1,func2。
func1没有返回值,func2有返回值

function outFunc(){
    func1();
    val = func2();
    return val;
}

func1内部有异步操作
如何确保只有在func1完成后才能调用func2

您将无法从func2返回值。如果您想在外部使用func2返回的值,那么outFunc也将有一个回调处理程序。

function outFunc(finalCallback){
    func1(func2,finalCallback);
}
function func1(callback, finalCallback)
{
 //once the asynch operation has finished
 callback(finalCallback);
}
function func2(finalCallback)
{
   //compute return-value
   finalCallback(return-value);
}

代码始终按照处理顺序执行。

但是,如果func1在内部执行异步操作,那么它将调用代码之外的不会立即返回的东西。func1本身将完成,但操作可能不会完成。

在这种情况下,func1应该将回调作为函数参数公开。func1内部在结构上直观地类似于以下内容:

function func1(callback) {
    // do some stuff
    callback();
}

现在,在do some stuff中,将存在具有相同警告的异步操作,因此func1将负责根据需要将callback适当地传递到这些操作中。这个结构实际上取决于这些操作是什么。

但关键是,任何执行异步操作的函数都应该公开一个回调,以便在该操作完成后调用。然后你会用它作为:

func1(func2);

但是请注意,您在这里遇到了另一个问题。因为func1是异步的,所以outFunc也是异步的。这意味着这不会奏效:

return val;

outFunc将在异步操作完成之前完成。因此,不会返回任何有价值的东西。对于这个高度关联的问题,有一些非常好的深入解释。但从本质上讲,您需要重新思考如何构建代码。而问题中提供的这个人为的例子并不能真正提供这方面的建议。

您需要提供回调,而不是返回值。通常使用返回值执行某些操作的代码将被放入回调中,并在稍后值可用时执行该操作。