我需要从这个函数中获取变量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){
答案 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