从内部回调中确定变量

时间:2015-12-29 02:13:07

标签: javascript node.js asynchronous callback async-await

我诚实地认为这个问题没有重复,因为我知道如何使用回调修复它作为链接问题中的解释,这个问题具体是关于我无法修改outfer函数的情况,这不是另一个问题涉及

我使用的是无法修改的库,库可以这样做:

var result = Foo()

然后它使用result进行工作。我无法修改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中为图书馆询问什么,或者强迫请求同步的方式

2 个答案:

答案 0 :(得分:1)

这是您使用同步请求的方法:

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,请修改它以同步发送请求。

答案 1 :(得分:0)

您尝试做的事情本身是不可能的,一旦代码是异步的,就不能像使用同步代码那样使用它。这就是callback hell为什么的原因。

您可以尝试分析模块内部和monkey patch,但这可能无法实现,具体取决于模块公开的导出。