首先,这是一个非常具体的案例,故意以错误的方式将异步调用改造成非常同步的代码库,该代码库长达数千行,而且时间目前无法进行更改“做对了”。它伤害了我的每一根纤维,但现实和理想往往无法融合。我知道这很糟糕。
好的,那不碍事了,我该怎么做才能做到:
function doSomething() {
var data;
function callBack(d) {
data = d;
}
myAsynchronousCall(param1, callBack);
// block here and return data when the callback is finished
return data;
}
所有示例(或缺少示例)都使用库和/或编译器,这两者都不适用于此解决方案。我需要一个具体示例来说明如何使其阻塞(例如,在调用回调之前不要离开 doSomething 函数)而不卡住 UI。如果这样的事情在 JS 中是可能的。
最佳答案
"don't tell me about how I should just do it "the right way" or whatever"
好的。 但你真的应该以正确的方式去做......或其他任何事情
" I need a concrete example of how to make it block ... WITHOUT freezing the UI. If such a thing is possible in JS."
不,不可能在不阻塞 UI 的情况下阻塞正在运行的 JavaScript。
由于缺乏信息,很难提供解决方案,但一种选择可能是让调用函数进行一些轮询以检查全局变量,然后让回调将 data
设置为全局。
function doSomething() {
// callback sets the received data to a global var
function callBack(d) {
window.data = d;
}
// start the async
myAsynchronousCall(param1, callBack);
}
// start the function
doSomething();
// make sure the global is clear
window.data = null
// start polling at an interval until the data is found at the global
var intvl = setInterval(function() {
if (window.data) {
clearInterval(intvl);
console.log(data);
}
}, 100);
所有这些都假设您可以修改 doSomething()
。我不知道这是否在卡片中。
如果它可以被修改,那么我不知道你为什么不只是将一个回调传递给 doSomething()
以从另一个回调中调用,但我最好在我得到之前停下来陷入麻烦。 ;)
哦,什么鬼。你举了一个例子表明它可以正确完成,所以我将展示这个解决方案......
function doSomething( func ) {
function callBack(d) {
func( d );
}
myAsynchronousCall(param1, callBack);
}
doSomething(function(data) {
console.log(data);
});
因为您的示例包含一个传递给异步调用的回调,所以正确的方法是将一个函数传递给 doSomething()
以从回调中调用。
当然,如果这是回调唯一要做的事情,您只需直接传递 func
...
myAsynchronousCall(param1, func);
关于javascript - 同步调用异步 Javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9121902/