访问函数作用域js之外的填充变量

时间:2014-04-03 11:50:02

标签: javascript

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

1 个答案:

答案 0 :(得分:0)

这很可能与您的功能范围无关。

在发出请求的大多数常见场景中,您都是异步执行,这意味着您的console.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);

你也可以马上开始学习Promises ......例如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);
});