2013-04-05 174 views
0

我開始懷疑,jquery易於使用和靈活。 我有這樣的:jQuery的全局變量可用無處不在

var prodata=[]; 
var request = $.get("proDB.txt", function(data) { 
    var lines=data.split(/\n/); 
    var numberofmodels=lines.length-2; 
    //var prodata=[]; 
    var i; 
    prodata.push(0); 
    var fieldnames=lines[0].split(/\t/); 
    for (i = 1; i < lines.length-1; ++i) { 
     var fields=lines[i].split(/\t/); 
     prodata.push(i);    
     var j; 
     prodata[i]={}; 
     for (j = 0; j < fields.length; ++j) { 
      //prodata[i][fieldnames[j]]=fields[j]; 
      var str=fieldnames[j]; 
      prodata[i][str]=fields[j]; 

     } 
    } 

    //FILL THE DROPDOWN LIST 
    var options = ''; 
    for (i = 1; i < lines.length-1; ++i) { 
     if (prodata[i]['name'].indexOf("elly") >= 0) { 
      var iselected = i; 
     } 
     options += '<option label="bla" value="' + prodata[i]['id'] + '">' + prodata[i]['name']+', '+prodata[i]['brand']+', '+prodata[i]['model']+'</option>'; 
    } 
    $("#userchosenpromodel").html(options); 
    //SELECT DEFAULT OPTION 
    $('#userchosenpromodel option[value="' + prodata[iselected]['id'] + '"]').attr("selected", "selected"); 
}, 'text'); //$.get 

我想在我的代碼使用proId,下,它被定義一樣,後:

//SUBMIT FORM 
$('#submitbutton').click(function(e) { 
    e.preventDefault(); 
    request.done(function(){ 
     proId=$('#userchosenpromodel option[selected="selected"]').val(); 
     proId=parseInt(proId); 
     computeUserDimensions(prodata[proId]); 
    }); 
}); 
    console.log(proId); 

如何?

prodata同樣的問題...我有request.done,我無法擺脫的

感謝

+0

嗯..簡單的時間問題。 'console.log'在'request.done'之前運行,所以它會在更改之前記錄該值。 – Leeish 2013-04-05 15:01:02

+0

你不能。我很抱歉以同樣的方式繼續回答,但是......你不能。 Ajax是異步的。如果你想以這種方式編寫代碼,你必須使它同步並處理帶來的副作用。否則,重新組織您的代碼,以便在完成的回調之外不需要proId。 – 2013-04-05 15:01:06

+0

你是對的...我不習慣這種類型的algorythmic – Louis 2013-04-05 15:30:30

回答

4

你沒有問題的jQuery但基於異步/事件邏輯。

不能同步使用返回的異步函數。您必須使用該結果在回調或在功能,您從回調調用:

request.done(function(){ 
    var proId=$('#userchosenpromodel option[selected="selected"]').val(); 
    console.log(proId); 
}); 
+0

在我的問題的評論中看到PROBLEM ... – Louis 2013-04-05 15:42:04

+0

「您沒有jQuery的問題,但是使用基於異步/事件的邏輯。」 ...你是對的。我習慣於標準的oldshool代碼。 – Louis 2013-04-05 19:28:08

0

爲什麼不這樣做:

request.done(function(){ 
    proId=$('#userchosenpromodel option[selected="selected"]').val(); 
    doSomethingWithProId(); 
}); 

function doSomethingWithProId(){ 
    console.log(proId); 
} 

左右,它並不需要成爲一個全球

request.done(function(){ 
    var proId=$('#userchosenpromodel option[selected="selected"]').val(); 
    doSomethingWithProId(proId); 
}); 

function doSomethingWithProId(proId){ 
    console.log(proId); 
} 

我心中的第二種解決方案更好。無論您需要如何使用proId構建您的函數來傳遞數據。這樣你就不需要污染全球範圍。聽起來你需要更好地理解JS。

+0

這就是我剛纔所做的,謝謝 – Louis 2013-04-05 15:34:15

+0

在我的問題的評論中看到PROBLEM – Louis 2013-04-05 15:38:15