Javascript等待功能完成

时间:2018-03-24 09:33:44

标签: javascript asynchronous

我知道这个问题已被问过几十次,但是我转过谷歌紫色仍然找不到适合我的情况的答案。

我有一组三个函数,我需要从另一个函数中调用一个函数,并且需要每个函数在调用它之前完成。目前发生的是一个函数会调用另一个函数,然后在它调用的函数完成之前继续。

我所看到的大部分内容都说使用回调函数,我的问题是我的内部函数是从库中获取的,因此我无法使其适应接受回调函数作为参数。我也看到了超时的事情,但我不想强迫我的代码等待任何时间,我只是希望它一旦它调用的函数完成就继续。

我只是希望一切都能同步工作,就像我习惯使用任何其他语言一样。

为了说明我当前的代码,我使用的是three.js,这是(基本上)我所拥有的:

firstfunction(){
    secondFunction();
}

secondFunction(){
    var loader = new THREE.JSONLoader(); //loader is an object from three.js library

    //loader.load is a three.js function that calls thirdFunction that I made. I can not make loader.load send a callback function to thirdFunction, as thirdFunction takes its arguments from three.js library
    loader.load(url, thirdFunction); 
}

thirdFunction(){ //this is a function that gets called from loader.load
    //do stuff
}

我觉得我错过了一些非常微不足道的东西,但正如我所说,我找不到适合我需要的网上任何东西。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

即使某些库和api允许您同步执行操作,这也不是javascript 应该工作的方式。即使你已经习惯了其他语言,javascript就不同了。

你的问题的答案可能是'这是不可能的'。

尝试以正确的方式使用javascript,而不是让它像其他语言一样。

但是,有一些希望。一旦你完全理解了回调是如何工作的,并围绕它构建你的代码,你就会发现Promises是一个更好的回调模式。 Prom还需要一种回调,但仍然是异步的,但是让代码更容易阅读更容易。

然后,一旦您完全了解承诺,您就可以使用asyncawait。新浏览器支持此功能。这2个关键字可以让你的代码很多,并且可以看到'像你一样习惯同步,但它仍然是异步的。它非常棒。

修改

我想更直接地解决以下句子:

  

// loader.load是一个调用我所做的thirdFunction的three.js函数。我无法使loader.load向thirdFunction发送回调函数,因为thirdFunction从three.js库获取其参数

你真的需要发送第三个函数另一个回调吗?这是什么回调?它只是总是调用的另一个函数吗?

您可以从ThirdFunction正常调用另一个函数。如果您需要它是变量,您可以将该函数分配给变量。函数可以从父作用域访问变量。例如:

var callback = '..'; // assuming this a callback.

thirdFunction(){
    callback();
}

如果只有你的第二个函数知道回调应该是什么,你可能需要像这样构造它:

secondFunction(){
    var loader = new THREE.JSONLoader(); //loader is an object from three.js library

    var callback = '...';

    loader.load(url, function() {
        thirdFunction(callback);
    }); 
}