我知道这个问题已被问过几十次,但是我转过谷歌紫色仍然找不到适合我的情况的答案。
我有一组三个函数,我需要从另一个函数中调用一个函数,并且需要每个函数在调用它之前完成。目前发生的是一个函数会调用另一个函数,然后在它调用的函数完成之前继续。
我所看到的大部分内容都说使用回调函数,我的问题是我的内部函数是从库中获取的,因此我无法使其适应接受回调函数作为参数。我也看到了超时的事情,但我不想强迫我的代码等待任何时间,我只是希望它一旦它调用的函数完成就继续。
我只是希望一切都能同步工作,就像我习惯使用任何其他语言一样。
为了说明我当前的代码,我使用的是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
}
我觉得我错过了一些非常微不足道的东西,但正如我所说,我找不到适合我需要的网上任何东西。
非常感谢任何帮助
答案 0 :(得分:1)
即使某些库和api允许您同步执行操作,这也不是javascript 应该工作的方式。即使你已经习惯了其他语言,javascript就不同了。
你的问题的答案可能是'这是不可能的'。
尝试以正确的方式使用javascript,而不是让它像其他语言一样。
但是,有一些希望。一旦你完全理解了回调是如何工作的,并围绕它构建你的代码,你就会发现Promises
是一个更好的回调模式。 Prom还需要一种回调,但仍然是异步的,但是让代码更容易阅读更容易。
然后,一旦您完全了解承诺,您就可以使用async
和await
。新浏览器支持此功能。这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);
});
}