一尘不染

同步调用异步Javascript函数

javascript

首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。”
它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。

好的,顺便说一句,我该如何做,这样我可以:

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中有这种可能。


阅读 575

收藏
2020-04-25

共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);
2020-04-25