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

Accessing populated variable outside of function scope js

本文关键字:填充 变量 函数 范围 js 访问      更新时间:2023-09-26
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);

当我将其打印出函数范围时,它会返回一个空的 json 对象,如果我在函数中执行此操作,它会用相关数据填充它。

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

var i=5;
if(i>3){
    if(i>4)
    {

      i = 6;  
    }
}
alert(i);

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

在发出请求的最常见情况下,您异步执行,这意味着您的控制台.log在您发出请求后立即执行,您在请求中提供的函数仅在您获得响应时执行......(异步)

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

我非常希望apiHelper.APIPostRequest符合这种模式。但是由于我对任何这些框架都不了解,我不能肯定地说,但是通过它们的方式,您也描述了错误......这是我能看到的唯一明显的东西。


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);

你不妨马上开始了解承诺......例如,对于 Q,它应该是这样的:

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);
});