小编典典

同步调用异步 Javascript 函数

all

首先,这是一个非常具体的案例,故意以错误的方式将异步调用改造成一个非常同步的代码库,该代码库有数千行长,而且时间目前还没有能力进行更改以“做对的。”
它伤害了我的每一根纤维,但现实和理想往往无法融合。我知道这很糟糕。

好的,那不碍事了,我该怎么做才能做到:

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 中是可能的。


阅读 91

收藏
2022-05-04

共1个答案

小编典典

“不要告诉我我应该如何以“正确的方式”或其他方式去做”

好的。但你真的应该以正确的方式去做......或者其他什么

“我需要一个具体的例子来说明如何让它阻塞......而不冻结 UI。如果这样的事情在 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);
2022-05-04