在function1完成后调用function2

时间:2016-03-23 14:24:53

标签: javascript callback

我在JavaScript编码 我有两个函数func1,func2。
func1没有返回值,func2有返回值。

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

func1里面有异步操作 如何确保仅在func1完成后才调用func2?

2 个答案:

答案 0 :(得分:1)

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

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

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

function func1(callback) {

    // do some stuff

    callback();

}

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

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

func1(func2);

但请注意,此处遇到另一个问题。因为func1是异步的,所以outFunc也是异步的。这意味着这不起作用:

return val;

outFunc将在异步操作完成之前完成。因此,不会返回任何有价值的东西。对this highly-linked question有一些非常好的深入解释。但基本上你需要重新思考如何构建代码。而问题中提供的人为举例并不能真正为此提供建议。

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

答案 1 :(得分:1)

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

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