1

我需要prodata从这个函数(动态填充)中获取变量,以便在另一个函数中使用它。但我不知道我可以使用return. 将 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){
4

3 回答 3

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
于 2013-04-04T20:00:19.147 回答
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 方法。

于 2013-04-10T18:36:05.010 回答
-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
于 2013-04-04T20:13:47.630 回答