正在从内部回调中分配变量

Assing variable from inner callback

本文关键字:分配 变量 回调 内部      更新时间:2023-09-26

老实说,这个问题没有重复,因为我知道如何使用回调来修复它,正如链接问题中所解释的那样,这个问题是关于我无法修改outer函数的情况,而这在另一个问题中没有涉及

我使用了一个我不能修改的库,该库做了这样的事情:

var result = Foo()

然后使用CCD_ 2进行工作。我不能修改result的工作方式,我只能修改Foo,因为我将其作为参数传递给库。

如果foo有类似的

funcion Foo(){
  return "Hello"
}

它工作得很完美。结果是Hello,并且它是有效的。

问题是我的Foo内部有一个异步调用。它调用了一个web服务器,然后应该返回服务器的响应。所以

funcion Foo(){
   request.get('http://server.com', function(error, response, body){
      var parsed = JSON.parse(body);
      return parsed.Hello;
   });
}

在这种情况下,当var result = Foo();result不包含服务器的响应(因为是异步的),并以空结果继续。

那么,如果我只能修改Foo,我该怎么办?

更新:如果你觉得不可能,我很想听听其他选择,比如我应该在PR中为库要求什么,或者强制请求同步的方法

这就是处理同步请求的方法:

funcion Foo(){
   var request = new XMLHttpRequest();
   request.open("GET", "http://server.com", false);
   request.send();
   function handleResponse(response) {
      console.log(response);
   }
   handleResponse(request.responseText);
}

如果您只能修改Foo,则修改它以同步发送请求。

您试图做的事情本身是不可能的,一旦代码是异步的,就不能像同步代码那样使用它。这就是为什么回调地狱是一件事。

您可以尝试分析模块内部并对其进行猴子补丁,但这可能不可能,具体取决于模块公开的导出内容。