从$ .get函数中获取返回变量

时间:2013-04-04 19:57:59

标签: jquery

我需要从这个函数中获取变量prodata(动态填充),以便在另一个函数中使用它。但我不知道我可以使用return。放置返回的位置,以便我可以在此函数之外使用prodata。

$.get("proDB.txt", function(data) {
    var lines=data.split(/\n/);
    var numberofmodels=lines.length-2;
    var prodata=[];
    var i;
    var fieldnames=lines[0].split(/\t/);
    for (i = 1; i < lines.length-1; ++i) {
        var fields=lines[i].split(/\t/);
        var j;
        prodata[i]={};
        for (j = 0; j < fields.length; ++j) {
            prodata[i][fieldnames[j]]=fields[j];
        }
    }
    //remplir la liste déroulante:
    var options = '';
    for (i = 1; i < lines.length-1; ++i) {
        if (prodata[i]['name'].indexOf("elly") >= 0) {
            options += '<option value="' + prodata[i]['id'] + '" selected>' + prodata[i]['name']+', '+prodata[i]['brand']+', '+prodata[i]['model']+'</option>';
        }else{
            options += '<option value="' + prodata[i]['id'] + '">' + prodata[i]['name']+', '+prodata[i]['brand']+', '+prodata[i]['model']+'</option>';
        }
    }
$("#userchosenpromodel").html(options);
}, 'text'); //$.get

然后我需要在

中访问和使用prodata
$('#submitbutton').click(function(e) {
    e.preventDefault(); 
    //computeUserDimensions(prodata[proId]);
});

function computeUserDimensions(line){

3 个答案:

答案 0 :(得分:2)

您不能在该函数之外使用它,否则它将在它存在之前使用。另一种方法是使用延迟对象。

var request = $.get("myurl",handler,"text");

现在,如果你需要从handler获取数据,只需使用:

request.done(function(data){
    // use the data here, but not outside
    console.log(data)
});

解决这个问题的一种方法是让你的工作在处理程序中,但允许你获得修改后的var是在外部存储对它的引用,并且只能在.done()中访问它。

var prdata;
var request = $.get("myurl",function(data){
    prdata = data;
},"text");
console.log(prdata); // undefined because request isn't done
request.done(function(){
    console.log(prdata); // IS defined because request IS done
});
console.log(prdata); // undefined because request still isn't done

答案 1 :(得分:0)

另一种选择是像以前一样使prodata全局化,但禁用提交按钮直到它被填充。像这样:

// Declare prodata here
var prodata = [];

// Disable submitbutton so it won't be clicked before prodata is ready
$('#submitbutton').attr("disabled", "disabled");

$.get("proDB.txt", function(data) {
    var lines=data.split(/\n/);
    var numberofmodels=lines.length-2;
    var i;
    var fieldnames=lines[0].split(/\t/);
    for (i = 1; i < lines.length-1; ++i) {
        var fields=lines[i].split(/\t/);
        var j;
        prodata[i]={};
        for (j = 0; j < fields.length; ++j) {
            prodata[i][fieldnames[j]]=fields[j];
        }
    }
    //remplir la liste déroulante:
    var options = '';
    for (i = 1; i < lines.length-1; ++i) {
        if (prodata[i]['name'].indexOf("elly") >= 0) {
            options += '<option value="' + prodata[i]['id'] + '" selected>' + prodata[i]['name']+', '+prodata[i]['brand']+', '+prodata[i]['model']+'</option>';
        }else{
            options += '<option value="' + prodata[i]['id'] + '">' + prodata[i]['name']+', '+prodata[i]['brand']+', '+prodata[i]['model']+'</option>';
        }
    }
    $("#userchosenpromodel").html(options);

    // Enable submitbutton since prodata is now available
    $('#submitbutton').removeAttr("disabled");
}, 'text'); //$.get

$('#submitbutton').click(function(e) {
    e.preventDefault(); 

    // Do an if check here just in case we somehow got here when prodata wasn't ready
    if ( prodata.length > 0 ) computeUserDimensions(prodata[proId]);
});

function computeUserDimensions(line){}

这将允许您从click方法访问prodata,因为在prodata可用之前永远不会访问click方法。

答案 2 :(得分:-1)

正如其他人所指出的那样,由于$ .get调用的异步性质,使用回调之外的变量会产生问题。但是,如果需要,可以使呼叫同步。为此,您必须使用更通用的$ .ajax而不是$ .get,并将其传递给async:false,并且您需要在ajax调用之上定义prodata:

var prodata=[];
$.ajax({
  url: 'proDB.txt',
  async: false,
  dataType: 'text',
  success: function(data) {
      // do stuff to prodata here
  }
});
// use prodata here