javascript - 同步调用异步 Javascript 函数

标签 javascript asynchronous

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

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

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/

相关文章:

javascript - 仅当条件为真时才执行另一个异步函数之前执行某些异步函数的最佳方法?

php - 使 curl_multi 'sleep' 或等待发送下一个请求

javascript - Async.js 返回 promise

javascript - 如何使用css使主要内容div填充屏幕高度

javascript - 在 node.js 中读取缓冲区对象

node.js - NodeJS 异步/等待和函数调用

c# - 为什么 HttpClient 总是给我相同的响应?

javascript - 为什么 split 函数不能得到第一个 null ?

javascript - 如何从 .t​​hen() 以 Angular 返回对函数的响应?

javascript - 使用 CryptoJS 解密 AES CFB 时有效字节数错误