2

我似乎一辈子都得不到这个。在调用 getJson2 函数后,我无法访问变量“json”。我通过一个 php 脚本动态地获取我的 json,这很有效。但后来它消失了。在InfoVis 示例中,有一个示例用作指南,其中 json 嵌入在 init 函数中。我正在尝试动态地获取它。

<script language="javascript" type="text/javascript">
var labelType, useGradients, nativeTextSupport,animate,json;
function getJson2()
{
  var cd = getParameterByName("code");
  $.get("tasks.php?code="+cd, function(data){
    return data;
  })
 };
function getParameterByName(name)
{
  name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
  var regexS = "[\\?&]" + name + "=([^&#]*)";
  var regex = new RegExp(regexS);
  var results = regex.exec(window.location.search);
  if(results == null)
    return "";
  else
    return decodeURIComponent(results[1].replace(/\+/g, " "));
}

(function() {
  var ua = navigator.userAgent,
      iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i),
      typeOfCanvas = typeof HTMLCanvasElement,
      nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'),
      textSupport = nativeCanvasSupport 
        && (typeof document.createElement('canvas').getContext('2d').fillText == 'function');
  //I'm setting this based on the fact that ExCanvas provides text support for IE
  //and that as of today iPhone/iPad current text support is lame
  labelType = (!nativeCanvasSupport || (textSupport && !iStuff))? 'Native' : 'HTML';
  nativeTextSupport = labelType == 'Native';
  useGradients = nativeCanvasSupport;
  animate = !(iStuff || !nativeCanvasSupport);
})();
debugger;
var Log = {
  elem: false,
  write: function(text){
    if (!this.elem) 
      this.elem = document.getElementById('log');
    this.elem.innerHTML = text;
    debugger;
    this.elem.style.left = (500 - this.elem.offsetWidth / 2) + 'px';
  }
};  
function init(){
json = getJson2();
    //init data
var st = new $jit.ST({  
    //id of viz container element  
    injectInto: 'infovis',  
    //set duration for the animation  
    duration: 800,  
    //set animation transition type  ..................
4

4 回答 4

2
function getJson2()
{
  var cd = getParameterByName("code");
  $.get("tasks.php?code="+cd, function(data){
    return data;
  })
};

getJson2()不返回任何东西。回调函数$.get()返回一些东西,但没有任何东西在监听那个返回。

听起来您想要同步加载。$.get()只是此$.ajax()调用的简写:(请参阅文档)

$.ajax({
  url: url,
  data: data,
  success: success,
  dataType: dataType
});

$.ajax()支持更多功能,例如设置asyncfalse.

$.ajax({
  url: "tasks.php?code="+cd,
  async: false,
  dataType: 'json',
  success: function(data) {
    // data !
  }
});

这意味着,getJson2然后变为:

function getJson2()
{
  var cd = getParameterByName("code");
  var jsonData;

  $.ajax({
    url: "tasks.php?code="+cd,
    async: false,
    dataType: 'json',
    success: function(data) {
      jsonData = data;
    }
  });

  return jsonData;
};

var myJsonData = getJson2();

或者仍然使用$.get异步样式,并使用回调代替。

function getJson2(callback)
{
  var cd = getParameterByName("code");
  $.get("tasks.php?code="+cd, function(data){
    callback(data);
  });
};

getJson2(function(data) {
  // do stuff now that json data is loaded and ready
});
于 2012-12-12T18:49:18.963 回答
1

$.get调用是异步的。当您调用 时return data;,该函数早已返回。在函数范围之外创建一个变量,然后在$.get回调处理程序中分配data给该变量。

var json;

function getJson2(){
    // ...
    $.get(...., function(response){
        json = response;
    }
});

或者,您可以进行同步Ajax 调用,在这种情况下返回您的数据将起作用(但当然会阻止脚本执行,直到收到响应)。要做到这一点,请参阅jQuerys函数asynch的参数。$.ajax

于 2012-12-12T18:41:58.717 回答
1

jQuery $.get 调用是异步的,实际上返回的是一个承诺,而不是数据本身。

处理此问题的一种优雅方法是使用then() 方法

$.get(...).then(function(data){...});

或者,更改您的 ajax 设置以使调用同步。

于 2012-12-12T18:52:37.053 回答
0
$.get("tasks.php?code="+cd, function(data){
    return data;
  })

$.get 是异步的。所以你的价值永远不会被退回。您必须创建一个回调。

同样的问题出现在这里: Return $.get data in a function using jQuery

于 2012-12-12T18:44:40.320 回答