首先,这是一个非常具体的案例,故意以错误的方式将异步调用改造成一个非常同步的代码库,该代码库有数千行长,而且时间目前还没有能力进行更改以“做对的。” 它伤害了我的每一根纤维,但现实和理想往往无法融合。我知道这很糟糕。
好的,那不碍事了,我该怎么做才能做到:
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 中是可能的。
“不要告诉我我应该如何以“正确的方式”或其他方式去做”
好的。但你真的应该以正确的方式去做......或者其他什么
“我需要一个具体的例子来说明如何让它阻塞......而不冻结 UI。如果这样的事情在 JS 中是可能的。”
不,不可能在不阻止 UI 的情况下阻止正在运行的 JavaScript。
由于缺乏信息,很难提供解决方案,但一种选择可能是让调用函数进行一些轮询以检查全局变量,然后将回调设置data为全局变量。
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()
如果可以修改,那么我不知道您为什么不只是传递一个回调以doSomething()从另一个回调中调用,但我最好在遇到麻烦之前停下来。;)
哦,什么鬼。你举了一个例子,表明它可以正确完成,所以我将展示这个解决方案......
function doSomething( func ) { function callBack(d) { func( d ); } myAsynchronousCall(param1, callBack); } doSomething(function(data) { console.log(data); });
因为您的示例包含一个传递给异步调用的回调,所以正确的方法是传递一个doSomething()要从回调调用的函数。
当然,如果这是回调唯一在做的事情,你就func直接通过......
func
myAsynchronousCall(param1, func);