Javascript 访问函数范围js之外的填充变量

Javascript 访问函数范围js之外的填充变量,javascript,Javascript,当我把它打印出函数作用域时,它返回一个空的json对象,如果我在函数中这样做,它会用相关数据填充它 我创建了一个非常简单的JS文件,测试了范围问题,它可以工作: var JsonObj = {}; if (Titanium.Network.online) { apiHelper.APIPostRequest(APIURL + '/it', tempJSON, function(e) { var status = this.status; if (status == 200)

当我把它打印出函数作用域时,它返回一个空的json对象,如果我在函数中这样做,它会用相关数据填充它

我创建了一个非常简单的JS文件,测试了范围问题,它可以工作:

var JsonObj = {};
if (Titanium.Network.online) {
  apiHelper.APIPostRequest(APIURL + '/it', tempJSON, function(e) {
    var status = this.status;
    if (status == 200) {
      JsonObj = JSON.parse(this.responseText);
      //behaves as expected
      //console.log(JsonObj);           
    }
  }, function(err) {
    alert('Unknown error from api');
  });
} else {
  alert('No internet connection found');
}
console.log(JsonObj);

这很可能与函数作用域无关

在发出请求的大多数常见场景中,都是异步执行的,这意味着您的console.log在发出请求后立即执行,您在请求中提供的函数仅在收到响应时执行。。。(异步)

因此,当您在底部写出对象时,对象尚未设置。因为回调函数尚未执行

我非常希望apiHelper.APIPostRequest符合这种模式。但是,由于我不知道这些框架中的任何一个,我不能肯定,但用它们的方式,你也可以描述错误。。。这是我能看到的唯一明显的东西



你最好马上开始学习承诺。。。例如,对于Q,它应该是这样的:

var JsonObj = {};
console.log("Before Async Request: " + JsonObj);
if (Titanium.Network.online) {
  apiHelper.APIPostRequest(APIURL + '/it', tempJSON, function(e) {
    var status = this.status;
    if (status == 200) {
      JsonObj = JSON.parse(this.responseText);
      console.log("Inside Async Callback: " + JsonObj);
      //behaves as expected
      //console.log(JsonObj);           
    }
  }, function(err) {
    alert('Unknown error from api');
  });
} else {
  alert('No internet connection found');
}
console.log("After Async Request: " + JsonObj);

你能解释一下YOUR代码吗,告诉我们你在哪里声明了每个变量,函数中有哪些部分?你发布的4行代码没有错。问题是在其他地方,我修改了代码,将原始if嵌套到父if中。我发现,如果我将变量存储在父if中,而不是子if中,那么我确实可以很好地获得填充的对象。你知道为什么吗,再次感谢。-1:你知道你发布的代码中没有定义任何函数吗清理代码(缩进很糟糕,所以基本上不可读),发布你说有效的示例,而你说无效的示例。好的,用我正在编写的代码修改代码。谢谢,谢谢你。但是console.log不是在调用异步方法之后运行吗?(整个代码片段应按程序执行)因此,如果调用async方法,我会得到一个响应并设置JSONObject,难道我以后不应该在async方法之外访问填充的对象吗?不,如果它是一个异步函数,在这里很可能,您只需指示它在完成时执行一个函数(在本例中,当它得到响应时),然后您的代码就可以继续运行,而不必考虑什么时候会发生这种情况。尝试运行我发布的示例,您会注意到事件的顺序。对,那么我如何访问JSONObject以供以后在异步函数之外使用呢?您开始了解承诺:,请注意,该链接是到ES6的,因此您需要依赖许多其他implemantioans中的一个。。。例如q:,jquery:等等。看起来这是基于jquery的,Tianium不支持它。如果我将代码的其余部分嵌套在异步函数中,这是一种好的做法吗?(在国际单项体育联合会内)
var JsonObj = {};
console.log("Before Async Request: " + JsonObj);
if (Titanium.Network.online) {
  apiHelper.APIPostRequest(APIURL + '/it', tempJSON, function(e) {
    var status = this.status;
    if (status == 200) {
      JsonObj = JSON.parse(this.responseText);
      console.log("Inside Async Callback: " + JsonObj);
      //behaves as expected
      //console.log(JsonObj);           
    }
  }, function(err) {
    alert('Unknown error from api');
  });
} else {
  alert('No internet connection found');
}
console.log("After Async Request: " + JsonObj);
var deferred = Q.defer(),
    JsonObj = deferred.promise;
if (Titanium.Network.online) {
  apiHelper.APIPostRequest(APIURL + '/it', tempJSON, function(e) {
    var status = this.status;
    if (status == 200) {
      deferred.resolve(JSON.parse(this.responseText));
    }
  }, function(err) {
    deferred.reject(err);
  });
} else {
  alert('No internet connection found');
}

JsonObj.then(function(json) {
  console.log("After Async Request: " + json);
});